忽略每行中包含零的列并创建一个新对象

时间:2019-04-29 11:02:48

标签: r data-manipulation

我有一个列表对象,如下所示:

V1=c(5,5,5,5,5,5,5,5)
V2=c(0,10,0,10,0,10,0,10)
V3=c(0,0,15,15,0,0,15,15)
V4=c(0,0,0,0,20,20,20,20)
V5=c(25,25,25,25,25,25,25,25)
zz_new=cbind(V1,V2,V3,V4,V5)

如下所示:

enter image description here

我想对每一行进行操作,获取非零的数字,然后创建一个可以存储这些值的新对象。

例如对于第一行,我想要得到5和25。对于第二行,我想要得到5,10和25。对于第六行,我想要得到5、10、20和25,依此类推。

请注意,我不想删除任何列。

最终输出应该是一个看起来像这样的对象

New_Variable
5,25
5,10,25
5,15,25
5,10,15,25
5,20,25
5,10,20,25
5,15,20,25
5,10,15,20,25

我写了一个函数来做到这一点:

zz_new_create=list()

for (i in 1:nrow(zz_new)){
  for (ii in 1:ncol(zz_new)){
    if (zz_new[i,ii]>0){
      zz_new_create[i,ii]=zz_new[i,ii]
    }
  }
}

但是出现以下错误:

Error in zz_new_create[i, ii] <- zz_new[i, ii] : incorrect number of subscripts on matrix

我要去哪里错了?任何帮助将不胜感激。预先感谢。

2 个答案:

答案 0 :(得分:2)

在此处以行模式尝试使用apply

zz_new_create <- apply(zz_new, 1, function(x) { x[x!=0] })

请记住,这会生成一系列锯齿状(不均匀)向量,即列表中的每个条目都是长度可能不同的向量。

答案 1 :(得分:1)

作为Tim答案的总和,如果您希望结果是一个向量,且所有值都用逗号分隔,则只需添加以下内容即可:

New_variable = apply(zz_new, 1, function(x) { paste(x[x!=0],collapse=",") })
> New_variable
[1] "5,25"          "5,10,25"       "5,15,25"       "5,10,15,25"    "5,20,25"       "5,10,20,25"    "5,15,20,25"   
[8] "5,10,15,20,25"