用于数据帧的每一行返回非零元素作为阵列中的R

问题描述:

我有A R数据帧像以下用于数据帧的每一行返回非零元素作为阵列中的R

client  A  B   C   D 
     asd  awe  0   rty   0 
     wer  0  tyu  wer  0 

我所需的数据帧被以下

client  A  B   C   D  recom 
     asd  awe  0   rty   0  awe rty 
     wer  0  tyu  wer  0  tyu wer 

我希望所有非零元素是印在ccolumn 名字我使用下面的代码上面generare,但它似乎没有模具工作

df$recom= simplify2array(apply(df[2:5],1, function(x) paste(df[2:5]) [x!=0],collapse=" ")) 
+2

为什么你需要'simplify2array'? 'apply'输出是一个'vector'。 'df $ recom akrun

+1

@akrun我看到我的答案没有什么不同。我没有仔细阅读你的评论。你为什么不添加你的答案,我会删除我的。 – G5W

+0

@GSW没关系。我发现两个解决方案使用相同的而不承认,这就是为什么我评论。可能你没有看到它。没问题。感谢您的清除 – akrun

尝试:

df$recom <- apply(df[, 2:5],1, function(x) paste(x[x!=0], collapse=" "))

client A B C D recom 1 asd awe 0 rty 0 awe rty 2 wer 0 tyu wer 0 tyu wer

或者更快的选择是paste按行的元素,然后我们在提到删除0值

df$recom <- trimws(gsub("^0 +| +0|0 +0", "", do.call(paste, df1[-1]))) 
df$recom 
#[1] "awe rty" "tyu wer" 

评论,simplify2array不需要与apply调用作为ea中的元素ch行是paste d一起得到一个vector作为输出。事实上,在OP的解决方案中,不是使用匿名的'x'子集和后来的paste,而是使用完整的数据集,即df[2:5]。因此,它应该是注释中的一个(与另一个解决方案中发布的类似)