如果我重复了一个问题,我很抱歉,但我是一个新手,我找不到答案(可能是因为我缺乏术语)。
我生成了一个像这样的数据帧:
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。如果你用不同的表述,你会很快得到它。