关于 r:text to column,不要重复列名


text to column, do not repeat column name

本问题已经有最佳答案,请猛点这里访问。

我有一个如下所示的 df:

1
2
3
4
id  name                 grade
1   rich, tom, todd,     12
2   chris,mary           9
3   larry                10

我运行以下代码将文本拆分为列:

1
newdf <- within(df, name<-data.frame(do.call('rbind', strsplit(as.character(name), ',', fixed=TRUE))))

这是我的输出:

1
2
3
4
id  name.X1   name.X2   name.X3    grade
1   rich       tom       todd       12
2   chris      mary      chris      9
3   larry      larry     larry      10

我的代码是重复名称(在 id 2


我们可以使用 splitstackshape

中的 cSplit

1
2
3
4
5
6
library(splitstackshape)
cSplit(df,"name",",")
#   id grade name_1 name_2 name_3
#1:  1    12   rich    tom   todd
#2:  2     9  chris   mary     NA
#3:  3    10  larry     NA     NA

如果我们使用 strsplit,由于 list 元素的长度不等,最好用 NA 填充,否则元素会重复。对于最后用 NA 填充,一个选项是获取每个 list 元素的 length,这可以用 lengths 完成,取 max (\\'mx\\') 并分配 length 到 \\'mx\\'。然后,我们只需根据 \\'mx\\' 在 \\'df\\' 上创建新列。

1
2
3
4
5
6
7
8
lst <- strsplit(as.character(df$name),",\\\\s*")
mx <- max(lengths(lst))
df[paste0("name", seq(mx))] <- lapply(lst, `length<-`, mx)
df[setdiff(names(df),"name")]
#  id grade name1 name2 name3
#1  1    12  rich chris larry
#2  2     9   tom  mary  <NA>
#3  3    10  todd  <NA>  <NA>