【问题标题】:Subsetting of data.frames with variable name vs. column number具有变量名称与列号的 data.frames 子集
【发布时间】:2019-11-28 13:04:20
【问题描述】:

我对 R 相当陌生,并且多次遇到子集数据帧的问题。我找到了解决方法,但只是想了解我缺少什么。

这是一段示例代码,我不明白其中的功能差异。

示例数据框:

df <- data.frame(V1 = c(1:10), V2 = c(rep(1, times = 10)))

这会产生“选择了未定义的列”错误:

df1 <- df[df$V1 < 5, df$V2]

但这有效:

df2 <- df[df$V1 < 5, 2]

我不明白为什么当通过 $V2 按名称引用列时,我收到的结果与按编号引用同一列时不同。

这是一个非常基本的问题,我知道,但我只是想了解一下。

谢谢,如果格式关闭或其他任何事情(第一次发布..),也很抱歉,

克里斯托夫

【问题讨论】:

  • 为什么可能很难回答......但正确语法的例子是df[df$V1 &lt; 5, "V2"]df[df$V1 &lt; 5, ]$V2

标签: r subset


【解决方案1】:

df[df$V1 &lt; 5, df$V2] 不会给出"undefined columns selected" 错误。

df[df$V1 < 5, df$V2]
#  V1 V1.1 V1.2 V1.3 V1.4 V1.5 V1.6 V1.7 V1.8 V1.9
#1  1    1    1    1    1    1    1    1    1    1
#2  2    2    2    2    2    2    2    2    2    2
#3  3    3    3    3    3    3    3    3    3    3
#4  4    4    4    4    4    4    4    4    4    4

因为您在 df$V2 中只有 1 个,并且您的数据框中存在第一列。它为length(df$V2) 次选择第一列,并且由于不建议使用相同名称的列,它会为其添加前缀.1.2

这和做的一样

df[df$V1 < 5, c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)]

如果您选择数据中不存在的列,则会给出未定义的列选择错误。

df[df$V1 < 5, c(1, 3)]

[.data.frame(df, df$V1

您可以通过多种方式访问​​数据

按列名,即

df[df$V1 < 5, "V2"]
#[1] 1 1 1 1

或者

df$V2[df$V1 < 5]

并按列位置。

df[df$V1 < 5, 2]
#[1] 1 1 1 1

【讨论】:

  • 谢谢你!在我的第一个示例中(在我发布之前),我在第二列中只有 20 秒,然后产生了错误。通过您的解释,我想我明白了,当我通过“$Variable”对列进行子集时,我不选择此列,而是选择“df$Variable”向量中包含的所有列。这是正确的表达方式吗?这就是为什么它只会在“V2”的内容>比ncol(df)时产生错误,对吧?
  • @cmr.hauber 绝对正确。它不理解V2df$V2,它采用df$V2 的值并将它们用作子集列的索引。如果V2 中有任何值大于ncol(df),则会产生错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多