如何使用R中的循环条件将多个列值组合在一起

时间:2016-05-29 05:06:28

标签: r

现在我有一个类似下面的矩阵,我无法访问特定列,但使用matrixname [,3]来访问

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    8    2   10    9   NA   NA   NA   NA   NA    NA
[2,]   10    2    8   NA   NA   NA   NA   NA   NA    NA
[3,]    8    6    9   NA   NA   NA   NA   NA   NA    NA
[4,]    1    3   10    8   NA   NA   NA   NA   NA    NA
[5,]    4    6    9   NA   NA   NA   NA   NA   NA    NA
[6,]    8    2   10    9   NA   NA   NA   NA   NA    NA
[7,]    1    8    3   NA   NA   NA   NA   NA   NA    NA
[8,]    2    6    4   NA   NA   NA   NA   NA   NA    NA

当循环的i值为2时,我正在使用循环,我需要合并第一列和第二列值,如8,2 10,2。当我的循环i为3时,我必须将第1列合并到第3列,如8,2,10。

或者有没有更好的方法来轻松合并列值?稍后我需要将合并值8,2与另一个矩阵进行比较,以检查它是否存在。

我有另一个使用

形成的矩阵
  

df1 <- cSplit(data.frame(a = gsub('<-', '', trans$V1)), 'a', ' ','wide') aw <- cbind(df1, rules[,-1])

     a_1 a_2 a_3 V2       V3
 1:  10   8   3  7 0.318182
 2:   3   8  10  7 0.437500
 3:   8   3  10  7 1.000000
 4:   3   8  NA 22 0.448980
 5:   8   3  NA 22 0.846154
 6:   9   8  10  7 0.437500

我使用subset(aw,is.na(a_3))删除NA的行,然后我想使用循环合并a_2和a_3,因为我可能有a_4或a_5。 期望的输出:

    a_1  a_2,a_3  V2       V3
 1:  10   8,3     7 0.318182
 2:   3   8,10    7 0.437500
 3:   8   3,10    7 1.000000
 4:   3   8,NA   22 0.448980
 5:   8   3,NA   22 0.846154
 6:   9   8,10    7 0.437500

1 个答案:

答案 0 :(得分:2)

我们可以使用for循环(在这种情况下,创建一个对象来存储输出)或使用其中一个apply族函数,即sapply/lapply。在这种情况下,循环遍历列的序列,我们仅使用前3列。对matrixpaste行进行子集化,并将输出分配给已创建的'lst'。

lst <- vector("list", 3);
for(i in seq_along(lst)){
 lst[[i]] <- do.call(paste, 
      c(as.data.frame(m1[, 1:i, drop=FALSE]), list(sep=",")))
}

lst
#[[1]]
#[1] "8"  "10" "8"  "1"  "4"  "8"  "1"  "2" 

#[[2]]
#[1] "8,2"  "10,2" "8,6"  "1,3"  "4,6"  "8,2"  "1,8"  "2,6" 

#[[3]]
#[1] "8,2,10" "10,2,8" "8,6,9"  "1,3,10" "4,6,9"  "8,2,10" "1,8,3"  "2,6,4" 

如果我们需要matrixrbindcbind list的输出

do.call(cbind, lst)