我有一个列表对象,如下所示:
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。对于第六行,我想要得到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
我要去哪里错了?任何帮助将不胜感激。预先感谢。
答案 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"