使用循环使用不同的向量进行列选择

时间:2014-04-10 15:09:14

标签: r loops vector dataframe identity-column

假设我有3个向量(10个字符串):

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )

Data.frame Y包含10列和6行:

1 2 3 4 5 6 7 8 9 10  
0 1 0 0 1 1 1 0 1  0      
1 1 1 0 1 0 1 0 0  0      
0 0 0 0 1 0 0 1 0  1      
1 0 1 1 0 1 1 1 0  0      
0 0 0 0 0 0 1 0 0  0      
1 1 0 1 0 0 0 0 1  1

我想使用向量X,H en I在data.frame Y中进行列选择,使用向量中的“1”和“0”作为选择标准。 因此,使用'1'作为选择标准的向量X的结果应该是:

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
1 2   4    6 7
0 1   0    1 1
1 1   0    0 1
0 0   0    0 0
1 0   1    1 1
0 0   0    0 1
1 1   1    0 0

对于使用'1'作为选择标准的向量H:

H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
3      6    8  9  10
0      1    0  1  0
1      0    0  0  0
0      0    1  0  1
1      1    1  0  0
0      0    0  0  0
0      0    0  1  1

对于使用'1'作为选择标准的载体I:

I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )
6          10
1          0
0          0
0          1
1          0
0          0
0          1

为了方便和速度,我想使用一个循环。它可能是这样的:

all.ones <- lapply[,function(x) x %in% 1]

在结果(all.ones)中,每个向量的结果应保持分开。例如:

X 1,2,4,6,7    
H 3,6,8,9,10
I 6,10

3 个答案:

答案 0 :(得分:1)

问题是NA,使用which来绕过它。请考虑以下事项:

x <- c(1,0,1,NA)
x[x==1]
[1]  1  1 NA
x[which(x==1)]
[1] 1 1

答案 1 :(得分:1)

执行此操作的标准方法是使用%in%运算符:

Y[, X %in% 1]

为多个向量执行此操作(假设您需要 AND 操作):

mylist = list(X, H, I, D, E, K)
Y[, Reduce(`&`, lapply(mylist, function(x) x %in% 1))]

答案 2 :(得分:0)

这个怎么样?

idx <- which(X==1)
Y[,idx]

编辑:对于六个向量,请执行

idx <- which(X==1 & H==1 & I==1 & D==1 & E==1 & K==1)
Y[,idx]

如果您想要Y列中至少有一个列的列数为1,请将&替换为|