如何以编程方式比较R中的整行?

时间:2016-05-21 05:13:41

标签: r select dataframe

我在R中有以下数据框:
data= Time X1 X2 X3 1 1 0 0 2 1 1 1 3 0 0 1 4 1 1 1 5 0 0 0 6 0 1 1 7 1 1 1 8 0 0 0 9 1 1 1 10 0 0 0

有没有办法以编程方式选择那些等于(0,1,1)的行?我知道可以通过执行data[data$X1 == 0 & data$X2 == 1 & data$X3 == 1,]来完成,但在我的场景中,(0,1,1)是变量中的列表。我的最终目标是确定等于(0,1,1)的行数,或列出变量可以容纳的任何其他组合。

谢谢!

马里亚诺。

3 个答案:

答案 0 :(得分:3)

以下是使用merge的几个选项:

merge(list(X1=0,X2=1,X3=1), dat)
#or
merge(setNames(list(0,1,1),c("X1","X2","X3")), dat)

甚至根据您想要匹配的列使用位置索引:

L <- list(0,1,1)
merge(L, dat, by.x=seq_along(L), by.y=2:4)

所有回归:

#  X1 X2 X3 Time
#1  0  1  1    6

如果匹配变量的类型相同,您也可以通过矩阵比较安全地完成:

dat[colSums(t(dat[c("X1","X2","X3")]) == c(0,1,1)) == 3,]

答案 1 :(得分:1)

apply(data, 1, function(x) all(x==c(0,1,1)))

这将向下移动每一行,并为行等于TRUE的每一行返回c(0,1,1)

答案 2 :(得分:0)

这是您的数据

mydf <- structure(list(Time = 1:10, X1 = c(1L, 1L, 0L, 1L, 0L, 0L, 1L, 
0L, 1L, 0L), X2 = c(0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L), 
    X3 = c(0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L)), .Names = c("Time", 
"X1", "X2", "X3"), class = "data.frame", row.names = c(NA, -10L
))

使用子集

subset(mydf, X1 == 0 & X2==1 & X3==1)
#  Time X1 X2 X3
#6    6  0  1  1

另一种方式

mydf[mydf$X1 ==0 & mydf$X2 ==1 & mydf$X3 ==1, ] 
#   Time X1 X2 X3
#6    6  0  1  1

或者像这样

mydf[mydf$X1 ==0 & mydf$X2 & mydf$X3 %in% c(1,1), ]
#  Time X1 X2 X3
#6    6  0  1  1

你也可以通过

来做到这一点
library(dplyr)
filter(mydf, X1==0 & X2==1 & X3==1)
#   Time X1 X2 X3
#1    6  0  1  1