1

我创建了 3 个向量:

v1 = c(1,2,3)
v2 = c(11,22,33)
v3 = c(111,222,333)

然后我用它们做了一个框架:

> df = data.frame(vec1 = v1, vec2 = v2, vec3 = v3)                                                                                                                                
> df
  vec1 vec2 vec3
1    1   11  111
2    2   22  222
3    3   33  333

现在似乎列名不是自动的,但是vec1, vec2, vec3.

在此之后,我想获得一个vec2等于 11 的帧行:

> df[vec2 == 11,]
Error in `[.data.frame`(df, vec2 == 11, ) : object 'vec2' not found

但以下代码有效:

> df[v2 == 11,]
  vec1 vec2 vec3
1    1   11  111

我认为这是错误的。我不明白为什么R使用旧的矢量名称,而不是 tags vec1, vec2, vec3

这是我的版本的错误R吗?

R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin12.2.0/x86_64 (64-bit)
4

4 回答 4

2

当您使用以下语法时:

df[vec2 == 11,]

R 试图df根据vec2向量的值选择行。但是没有这样的向量:您的数据框中只有一个具有此名称的列。所以你正在寻找的语法是:

df[df$vec2 == 11,]

以下是有效的,因为该向量之前已在您的 R 会话中定义:

df[v2 == 11,]
于 2013-01-27T20:50:33.750 回答
2

要么使用:

df[df$vec2 == 11, ]

或者

df[with(df, vec2 == 11), ]

第二个有效,因为v2 == 11计算结果为TRUE, FALSE, FALSE,因此第一行正在打印。但是,vec2不是设置的变量。它是 a 的一列data.frame。因此,您必须使用df$vec2(或使用with)来识别它

于 2013-01-27T20:48:56.590 回答
2

这不是一个错误,而是一个误解 -v2使用删除rm(v2)并且df[v2 == 11,]会失败。可以使用subset()列名对数据框进行子集化:

> subset(df, vec2 == 11)
  vec1 vec2 vec3
1    1   11  111

subset还支持提取特定列,例如

> subset(df, vec2 == 11, select = vec1:vec2)
  vec1 vec2
1    1   11
于 2013-01-27T20:57:07.930 回答
0

如果您先附加 df,则可以使用上述语法:

df = data.frame(vec1 = v1, vec2 = v2, vec3 = v3)
attach(df)
df[vec2 == 11,]

将输出:

   vec1 vec2 vec3
1    1   11  111

虽然这在控制台上工作时可以避免纯粹的输入,但根据Google R 风格指南,在编写脚本期间通常应该避免这种情况。

于 2013-01-27T21:53:20.043 回答