我的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我希望细胞留空。知道我怎么能避免让它重复名字?谢谢。
答案 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>