与tidyr相反::将多个列连接成一个

时间:2016-07-15 13:46:29

标签: r dplyr tidyr

我有一个数据框:

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)
)

如何将列与sep = ","

连接/粘贴在一起

(tidyr :: separate()的反面,我猜?)

期望的输出:

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

提前致谢!

修改

我担心使用paste因为在我的真实数据集中我有1000列。

4 个答案:

答案 0 :(得分:10)

您可以使用unite中的tidyr功能:

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中描述的特殊函数。

答案 1 :(得分:3)

我们可以在没有任何软件包的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

答案 2 :(得分:0)

另一种方法可以做如下:

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

答案 3 :(得分:-1)

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

从以下数据框开始,df有3列('年','月'和'天'):

<强> DF

年月日

1 2009 01 01

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

df%&gt;%unite(时间,c(“年”,“月”,“天”),sep =“ - ”)

时间

1 2009-01-01