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

6

我有一个数据框dd2,其中有数百列,我需要做的是将所有这些列的值粘贴在一起,省略任何NA值。如果我像下面这样做:

apply(dd2, 1, paste, collapse=",")

实际上,它将NA作为字符串"NA"来处理。我希望避免这种情况。我也可以像下面展示的那样做,但这需要我逐个列地工作才能得到结果。

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

有没有更高效的方法来做这件事呢?这是一个样例数据:
dd2 <- structure(c("A", "B", "C", "D", "E", "AK2", "HFM1", NA, "TRR", 
"RTT", NA, "PPT", "TRR", "RTT", NA, "PPT", NA, NA, "GGT", NA), .Dim = c(5L, 
4L), .Dimnames = list(NULL, c("sample_id", "plant", "animal", 
"more")))

您的样本数据不是一个data.frame。使用“dd2”,您只是想将除第一列以外的所有列粘在一起吗? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto 我想将选择的列值粘贴在一起,省略任何NAs。例如,我想要粘贴 dd2[,wanted.columns] - MAPK
1
也许这个也可以起作用:melt(as.data.table(dd2), measure.vars = c("plant", "animal"), na.rm = TRUE)[, toString(value), by = .(sample_id, more)] - A5C1D2H2I1M1N2O1R2T1
2个回答

7
您可以尝试使用na.omit()来省略值,然后拼接。此外,您还可以使用toString(),因为它相当于paste(..., collapse = ", ")
apply(dd2, 1, function(x) toString(na.omit(x)))
# [1] "A, AK2, PPT"      "B, HFM1, PPT"     "C, TRR"          
# [4] "D, TRR, RTT, GGT" "E, RTT"   

如果您正在使用特定的列,那么
apply(dd2[, cols], 1, function(x) toString(na.omit(x)))

有没有办法指定不同的分隔符?(例如,使用“”而不是“,”)? - godines
@godines - 不在 toString 中。你需要使用 paste - Rich Scriven
谢谢@RichScriven。paste的问题在于NA单元格。我也可以使用na.omit,但是这样会导致行数不同的问题。它应该有一个选项来忽略NA单元格。 - godines
stringr::str_replace_na(c(NA, "abc", "def"), replacement='')。通常,对于比简单连接更复杂的操作,请参考 stringr - Ufos
@Ufos - 好的,但这还有一点要注意。stringr::str_replace_na(dd2, replacement='')并不能产生期望的结果。可以使用基本的R语言中的replace函数来实现完全相同的功能。 - Rich Scriven

3

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

您可以使用everything()来合并所有列。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接