【问题标题】:R error subsetting data.frame when using [[使用[[时的R错误子集data.frame
【发布时间】:2018-09-09 19:58:58
【问题描述】:

对于具有一列作为硫酸盐的数据框(数据), data[["sulfate"]]data[[colnames(data)=="sulfate"]] 有什么区别?

data["sulfate']data[colnames(data)=="sulfate"] 产生相同的值结果并具有数据框类,但在我的情况下 data[["sulfate"]] 结果为数字向量,但 data[[colnames(data)=="sulfate"]] 原来是一个错误。为什么?

【问题讨论】:

  • 后者是错误的。
  • 这是一个错误,但是 data["sulfate"] 和 data[colnames(data)=="sulfate"] 给出了具有相似值的数据框的相同输出,但是当我们尝试将其转换为数字时vector 使用 [[colnames(data)="sulfate"]] 结果是错误的。为什么?
  • [[ 的索引参数必须是标量,而不是逻辑向量。
  • @G.Grothendieck [[ 接受向量,我认为这不是这种情况下的问题。问题是第一个 FALSE 变成数字 0 并且错误是“尝试选择少于一个元素”。
  • @Karolis,不。如果对象参数是嵌套列表,它只接受向量。例如,list(1, list(2, 3))[[c(2, 1)]] 有效。

标签: r dataframe subset


【解决方案1】:

首先 - 这里有一些方法可以实现您想要实现的目标:

data$sulfate

getElement(data, "sulfate")

接下来简要解释为什么data[[colnames(data)=="sulfate"]] 不起作用。

1)[[ 中的表达式是colnames(data)=="sulfate",这是一个逻辑向量。

2) 函数[[ 接受单个元素(因为它用于选择单个元素)或数字向量,在这种情况下,它用于选择嵌套列表的元素。例如:

a <- list(list(2,3), list(3,4))
> a[[c(2,1)]]
[1] 3

帮助页面 help(`[[`) 将提供有关其工作原理的更多信息。

3) R 中的data.frame 对象是一个列表,您可以通过is.list(data) 来确认这一点。所以[[ 函数的工作原理是一样的。

现在,当您将向量而不是单个数字传递给它时会发生什么 - 它变成了 0 和 1 的数字表示。例如检查as.numeric(colnames(data)=="sulfate"))

然后子集 [[ 遇到 0 个条目,当您尝试使用 0 进行子集时,它会抛出一个错误,即您尝试选择少于一个元素。

data[[0]]

注意这个错误和data[[colnames(data)=="sulfate"]]做的时候是一样的

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2018-11-11
    相关资源
    最近更新 更多