首页 > 解决方案 > 忽略每行中包含零的列并创建一个新对象

问题描述

我有一个列表对象如下:

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)

看起来像这样:

在此处输入图像描述

我想做的是对每一行,获取非零的数字,然后创建一个新对象,我可以在其中存储这些值。

例如。对于第一行,我想获得 5 和 25。对于第二行,我想获得 5,10 和 25。对于第 6 行,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

我哪里错了?任何帮助将不胜感激。提前致谢。

标签: rdata-manipulation

解决方案


尝试apply在行模式下使用:

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

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


推荐阅读