如果我使用以下方法创建一个简单的数据框:
x <- 1:100
y <- x*2
df <- data.frame(x,y)
然后我尝试通过执行以下操作来选择x> 30和x <40的位置
df[df$x>30 && df$x<40]
我明白了:
data frame with 0 columns and 100 rows
我想理解为什么我会这样做以及如何解决它。
答案 0 :(得分:4)
您似乎有两个错误,请尝试这样做:
df[df$x>30 & df$x<40,]
# x y
# 31 31 62
# 32 32 64
# 33 33 66
# 34 34 68
# 35 35 70
# 36 36 72
# 37 37 74
# 38 38 76
# 39 39 78
<强>解释强>:
第一个错误是您使用的是&&
而不是&
。如果您确定比较长度为1的向量,则需要第一个表单。 See this question for details
第二个,就是你错过了一个逗号(“,”)。首先编写子集的条件,然后编写逗号,然后编写任何内容,将选择满足此条件的rows
。
当您尝试df
,df[]
和df[1,]
时,您可以检查具有相同df[,1]
的子集的差异。
答案 1 :(得分:1)
只是为了添加一些解决方案,还有其他方法可以做到这一点。另一种方法是subset
函数和/或%in%
(注意不同的行为):
subset(df, x > 30 & x < 40)
subset(df, x %in% c(31:39))
df[df$x %in% c(31:39), ]
或dplyr
:
library(dplyr)
# Standart dplyr notation
df %>% filter(x > 30, x < 40)
# Non-Standart dplyr notation
df %>% filter(x > 30 & x < 40)
都有相同的结果:
x y
31 31 62
32 32 64
33 33 66
34 34 68
35 35 70
36 36 72
37 37 74
38 38 76
39 39 78