与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
我有一个数据框:
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