与tidyr::separate相反,将多列拼接成一列

Opposite of tidyr::separate, concatenating multiple columns into one

我有一个数据框:

df <- data.frame(
    id = c(1, 2, 3),
    `1` = c("W4", "W5", 49),
    `2` = c("L", "O1", "P6"),
    `3` = c(1, 2, 10),
    `4` = c("H7", NA, "K"),
    `5` = c("J8", NA, NA)
)

如何 concatenate/paste 列与 sep = ","

(我猜是 tidyr::separate() 的反义词?)

期望的输出:

id  string
1   W4, L, 1, H7, J8
2   W5, O1, 2
3   49, P6, 10, K

提前致谢!

编辑

我对使用 paste 持谨慎态度,因为在我的真实数据集中我有 1000 列。

您可以使用 tidyr 中的 unite 函数:

library(tidyr)
unite(df, string, X1:X5, sep = ", ")
#  id            string
#1  1  W4, L, 1, H7, J8
#2  2 W5, O1, 2, NA, NA
#3  3 49, P6, 10, K, NA

请注意,它还有一个 remove 参数,默认情况下为 TRUE。如果将其设置为 FALSE,原始列将保留在数据中。

对于列规范(要合并哪些列),您可以像我上面那样使用冒号运算符 (:) 或使用 ?dplyr::select.

中描述的特殊函数

我们可以在 base R 中完成此操作而无需任何软件包

data.frame(id = df[1], string= do.call(paste, c(df[-1], sep=",")))
#  id        string
#1  1  W4,L,1,H7,J8
#2  2 W5,O1,2,NA,NA
#3  3 49,P6,10,K,NA

另一种方法如下:

mdf <- df %>% transform(strings=paste(X1,X2,X3,X4,X5, sep = ","))
mydf <- mdf[,c(1,7)]
> mydf
#  id       strings
#1  1  W4,L,1,H7,J8
#2  2 W5,O1,2,NA,NA
#3  3 49,P6,10,K,NA

这是另一个使用 'unite' 的示例,它与 'separate'...

相反

从以下数据框 df 开始,它有 3 列('year'、'month' 和 'day'):

df

  year  month day          

1 2009  01    01    

如果我们想将 'year'、'month' 和 'day' 列连接成一个名为 'time' 的列,我们可以使用连字符作为分隔符使用统一:

df %>% unite(time,c("year","month","day"),sep="-")


  time     

1 2009-01-01