r语言 - 不同的结果子集与列名



如果我重复了一个问题,我很抱歉,但我是一个新手,我找不到答案(可能是因为我缺乏术语)。

我生成了一个像这样的数据帧:

x1 <- c(1,2,3,4,5)
x2 <- c("a", "b", "c", "d", "e")
df <- data.frame(x1,x2)
   x1 x2
1  1  a
2  2  b
3  3  c
4  4  d
5  5  e

然后我尝试对第一列进行如下的子集条件反射

df[df$x1>3, "x2"]

结果如预期

[1] d e

然而当我尝试

df["x1" >3, "x2"]
[1] a b c d e

R似乎忽略了条件语句并返回整个列x2。是否有一种使用列名计算条件语句(<,>,==)的方法?

编辑:我想我找到了部分答案:R计算

"some text" > 1000 
[1] TRUE

这解释了为什么我得到了所有的行。

问题仍然存在:使用列名计算条件语句的好方法是什么?

我不会做很长的解释,因为我认为您可以通过几个例子清楚地了解这个问题。但基本上,如果你想使用字符数据帧名称,你需要一个像这样的结构

df[df[["x1"]] > 3, "x2"]
# [1] d e
# Levels: a b c d e

第二次尝试发生了什么

"x1" > 3
# [1] TRUE

然后基本上你所做的是

df[TRUE, "x2"]
# [1] a b c d e
# Levels: a b c d e

给出所有元素。我必须查找为什么一个字符总是大于一个数字的确切原因。我想这个原因之前在这里的某个地方已经详细描述过了。如果我没记错的话,它与类之间的优先级有关。我看看能不能找到

您的问题可能有许多答案,特别是取决于上下文和您正在处理的数据类型。在这种特殊情况下,您可以简单地使用df[x1 > 3, "x2"]

第一个参数用于行,第二个参数用于列。本质上,你说返回所有df行其中x1大于3。关于列,你只需要列x2。如果你用不同的表述,你会很快得到它。

最新更新