文本到列,不要重复列名

时间:2016-07-24 12:18:56

标签: r

我的df看起来如下:

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

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

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

这是我的输出:

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和3中),而不是放入空格或NA。我想要输出的代码如下:

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

或者不是N / A我希望细胞留空。知道我怎么能避免让它重复名字?谢谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用cSplit

中的splitstackshape
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的填充,一个选项是获取每个length元素的list,可以使用lengths完成,max(&# 39; mx&#39;)并将length分配给&#39; mx&#39;。然后,我们只需在&#39; df&#39;上创建新列。基于&#39; mx&#39;。

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>