R 如何在将多个列值粘贴在一起时忽略NA值?

R 如何在将多个列值粘贴在一起时忽略NA值?,r,R,我有一个包含数百列的数据框dd2,我需要做的是将所有这些列值粘贴在一起,忽略任何NA值。如果我做这样的事 apply(dd2, 1, paste, collapse=",") 它实际上包括NAs作为“NA”字符串。我想避免这种情况。我也可以做如下所示,但这将期望我一次为每个单独的列工作以获得结果 result <- cbind( dd2, combination = paste(dd2[,2], replace(dd2[,3], is.na(dd2[,3]),

我有一个包含数百列的数据框
dd2
,我需要做的是将所有这些列值粘贴在一起,忽略任何
NA
值。如果我做这样的事

apply(dd2, 1, paste, collapse=",")
它实际上包括
NA
s作为
“NA”
字符串。我想避免这种情况。我也可以做如下所示,但这将期望我一次为每个单独的列工作以获得结果

result <- cbind(    
    dd2, 
    combination = paste(dd2[,2], replace(dd2[,3], is.na(dd2[,3]), ""), sep = ",")
)

result您可以尝试
na.omit()
忽略值,然后粘贴。此外,还可以使用
toString()
,因为它相当于
粘贴(…,collapse=“,”)

如果您使用的是特定列,则

apply(dd2[, cols], 1, function(x) toString(na.omit(x)))

dd2
是一个矩阵,在这种情况下,使用@Rich Scriven建议的
apply
更合适。如果是数据帧,则可以使用
tidyr::unite

dd2 <- data.frame(dd2)
tidyr::unite(dd2, result, plant, animal, more, na.rm = TRUE, sep = ',')

#  sample_id      result
#1         A     AK2,PPT
#2         B    HFM1,PPT
#3         C         TRR
#4         D TRR,RTT,GGT
#5         E         RTT

示例数据不是
数据.frame
。使用“dd2”时,您只是想将除第一列之外的所有列粘贴在一起吗?@AnandaMahto我想将选定列值粘贴在一起,而忽略任何NAs。例如,我想粘贴
dd2[,wanted.columns]
。也许类似的东西也可以使用:
melt(as.data.table(dd2),measure.vars=c(“plant”,“animal”),na.rm=TRUE)[,toString(value),by=(sample\u id,more)]
。有办法指定不同的分隔符吗?(例如,“而不是,)?@godines-不在
toString
中。您必须使用
粘贴
。谢谢@RichScriven。
paste
的问题在于
NA
单元格。我也可以使用
na.ommit
,但是如果行数不同,就会出现问题。它应该可以选择忽略
NA
单元格。
stringr::str_replace_NA(c(NA,“abc”,“def”),replacement='')
。一般来说,参考
stringr
了解任何比简单串联更高级的东西。@Ufos-好的,但还有一点比这更重要<代码>字符串:str_replace_na(dd2,replacement='')
不会产生所需的结果。Base R的
replace
可以用来做完全相同的事情。
apply(dd2[, cols], 1, function(x) toString(na.omit(x)))
dd2 <- data.frame(dd2)
tidyr::unite(dd2, result, plant, animal, more, na.rm = TRUE, sep = ',')

#  sample_id      result
#1         A     AK2,PPT
#2         B    HFM1,PPT
#3         C         TRR
#4         D TRR,RTT,GGT
#5         E         RTT
tidyr::unite(dd2, result, dplyr::everything(), na.rm = TRUE, sep = ',')

#         result
#1     A,AK2,PPT
#2    B,HFM1,PPT
#3         C,TRR
#4 D,TRR,RTT,GGT
#5         E,RTT