代码之家  ›  专栏  ›  技术社区  ›  user1471980

基于delimeter拆分R中的数据帧单元

r
  •  0
  • user1471980  · 技术社区  · 12 年前

    我有一个这样的数据框架:

    x
    
    TicketID   Application     Impacted_Systems
    1          Web             Online; PeopleSoft, Financials
    etc
    

    我喜欢做的是创建另一个基于x$Impacted_Systems的数据帧,将用“;”分隔的每个项目放在自己的列中,然后将其与数据帧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 回复  |  直到 12 年前
        1
  •  1
  •   Maiasaura    12 年前
    # 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