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

如何以编程方式比较R中的整行?,r,select,dataframe,R,Select,Dataframe,我在R中有以下数据帧: 数据= 时间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)是变量中的列表。这里我的最终目标是确定列表变

我在R中有以下数据帧:
数据=
时间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)或任何其他组合

谢谢

Mariano.

应用(数据,1,函数(x)全部(x==c(0,1,1))

这将进入帧的每一行,并为每一行返回
TRUE
,其中该行等于
c(0,1,1)

apply(数据,1,函数(x)all(x==c(0,1,1))


这将进入帧的每一行,并为每一行返回
TRUE
,其中该行等于
c(0,1,1)

以下是使用
合并的两个选项:

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)
如果您的匹配变量都是相同类型的,您也可以通过矩阵比较安全地执行此操作,如:

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

这里有几个使用
合并的选项:

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)
如果您的匹配变量都是相同类型的,您也可以通过矩阵比较安全地执行此操作,如:

dat[colSums(t(dat[c("X1","X2","X3")]) == c(0,1,1)) == 3,]
这是你的数据

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
))
另一种方式

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
这是你的数据

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
))
另一种方式

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

你确定你真的需要数据帧而不是矩阵吗?谢谢@user31264!我从一个文件中导入数据,此时我得到一个数据帧。我对R是新手,所以这可能是另一种方法,可以用不同的结构来实现!如果您需要矩阵,您可以在阅读后将其作为.matrix执行。您确定您真的需要数据帧而不是矩阵吗?谢谢@user31264!我从一个文件中导入数据,此时我得到一个数据帧。我对R是新手,所以这可能是另一种方法,可以用不同的结构来实现!如果您需要矩阵,您可以在阅读后将其作为.matrix执行。谢谢@thelatemail!这肯定能做到,我尝试了不同的方法,我想我错过了转置操作。谢谢谢谢@thelatemail!这肯定能做到,我尝试了不同的方法,我想我错过了转置操作。谢谢