根据字符串模式将一列拆分为多列(在定界符之前)

时间:2019-03-04 17:02:43

标签: r dataframe split grouping

我想在R中执行以下操作(但可以接受bash中的建议):我有很长的元素列表(20,000个),属于80个组。每个组均以下划线定界符之前的相同字符串开头。我想根据下划线之前的模式将所有元素的列拆分为一个包含80列的新数据框。列的大小将不同,因此NA值是可以接受的。

例如我要拆分的列:

head(df$V1)

FOO1_Yu
FOO1_uN
FOO2_Yo
FOO2_yA
FOO10_nO
FOO10_Yes
FOO1_NoY

期望的结果(新的df,标题包含在第一行中):

head(df2)
FOO1    FOO2    FOO10
FOO1_Yu FOO2_Yo FOO10_nO
FOO1_uN FOO2_yA FOO10_Yes
FOO1_NoY        

有什么想法吗? (并预先感谢!)

1 个答案:

答案 0 :(得分:1)

以下内容使用reshape2包来获取您想要的结果。请注意,由于列被强制转换为存在缺失值的长格式data.frame,因此将它们替换为NA(您的问题显示了空格,其中列具有两个vs.e元素,但不可能在字段中使用真正的空格data.frame,因为所有行都需要填充某些内容,在本例中为NA(空白)。方法如下: (1)使用str_split将您的名称/值对用“ _”分隔,并将其返回到数据框 (2)使用dcast,其中名称值是您的值字符串的函数

library(reshape2)
head(df$V1)

df <- data.frame(V1=c("FOO1_Yu","FOO1_uN","FOO2_Yo","FOO2_yA","FOO10_nO","FOO10_Yes","FOO1_NoY"),stringsAsFactors = F)

splits <- lapply(df$V1,function(x)
  {
    if (!grepl("_",x)) 
    {
      print(paste("Skipping bad input=",x)) 
      return (NULL)
    } else { 
      pair <- unlist(strsplit(x,split="_"))
      name <- pair[1]
      value <- x
      return (data.frame(name=name,value=value)) 
    }
  })

splits <- do.call("rbind",splits)

df <- dcast(splits,value ~ name)

输出结果如下:

      value     FOO1    FOO2     FOO10
1   FOO1_Yu  FOO1_Yu    <NA>      <NA>
2   FOO1_uN  FOO1_uN    <NA>      <NA>
3   FOO2_Yo     <NA> FOO2_Yo      <NA>
4   FOO2_yA     <NA> FOO2_yA      <NA>
5  FOO10_nO     <NA>    <NA>  FOO10_nO
6 FOO10_Yes     <NA>    <NA> FOO10_Yes
7  FOO1_NoY FOO1_NoY    <NA>      <NA>