基于分隔符拆分R中的data.frame单元格

时间:2012-10-03 20:29:04

标签: r

我有一个这样的数据框:

x

TicketID   Application     Impacted_Systems
1          Web             Online; PeopleSoft, Financials
etc

我喜欢做的是创建另一个基于x $ Impacted_Systems的data.frame,将每个项目分隔为“;”到它自己的colum,然后用数据框x对它进行复制以绘制它。

到目前为止,我有这个:

data.frame(do.call('rbind', strsplit(as.character(x$Impacted_Systems),';'))) 

这会为每个字符串创建以“;”分隔的列两次:

X1      X2       X3       X4       X5   X6      X7
1   Online  PeopleSoft Financials   Online  PeopleSoft Financials           Online

任何想法我做错了什么?在这种特殊情况下,应该只有3列,而不是7列。

我试过这个

p<-colsplit(x$Impacted_Systems, ";") 

这是期待名字选项。问题是受影响系统的数量会有所不同,这是不固定的。

1 个答案:

答案 0 :(得分:1)

# some example data
df <- data.frame(Impacted_Systems = c("foo;bar", "foo;bar1;bar2", "foo;bar1;bar2;bar4;bar4"))

library(plyr)
library(reshape2)
split_names <- llply(as.list(df$Impacted_Systems), function(x){
                split_data <- data.frame(rbind(strsplit(x, ";")[[1]]))
                names(split_data) <- paste0("Impacted_Systems", 1:length(strsplit(x, ";")[[1]]))
                split_data
    })


> cbind(df, ldply(split_names))
         Impacted_Systems Impacted_Systems1 Impacted_Systems2
1                 foo;bar               foo               bar
2           foo;bar1;bar2               foo              bar1
3 foo;bar1;bar2;bar4;bar4               foo              bar1
  Impacted_Systems3 Impacted_Systems4 Impacted_Systems5
1              <NA>              <NA>              <NA>
2              bar2              <NA>              <NA>
3              bar2              bar4              bar4