列拆分基于某种分隔符格式

时间:2017-08-07 11:09:33

标签: r rscript

我有一种格式来分隔我将拥有此数据的位置:

df = data.frame(id=c(1,2),name=c('A~B~C','A~B~D'),value=c('1~2~3','1~~2'))
id   name      value
1    A~B~C     1~2~3
2    A~B~D     1~~2

预计会有以下输出,其中列名是原始列名,后跟名称列中的文本:

id   value_A   value_B   value_C  value_D
1      1         2          3      
2      1                            2

我设法通过使用许多嵌套的for循环逐行处理我的数据来实现拆分。它适用于小样本数据,但一旦数据变得庞大,时间就成了问题。

此外,可能有多个值列,但它们都应映射到同一列中。 示例输出:

id   value_A   value_B   value_C  value1_A   value1_B   value1_C
1      1         2          3       1           2          3
2      1         2          3       1           2          3   

2 个答案:

答案 0 :(得分:2)

您可以尝试dplyr

library(tidyverse)
df %>% 
 separate_rows(name, value, sep = "~") %>% 
 spread(name, value)
  id A B    C    D
1  1 1 2    3 <NA>
2  2 1   <NA>    2

您可以使用NA

中指定的任何内容填充空单元格,而不是fill = ""

或者baseR和reshape2

a <- strsplit(as.character(df$name), "~")
b <- strsplit(as.character(df$value), "~")
df2 <- do.call(rbind.data.frame, Map(cbind, df$id, a, b))
library(reshape2)
dcast(df2, V1~V2, value.var = "V3")
  A B C    D   
1 1 2 3    <NA>
2 1   <NA> 2   

答案 1 :(得分:0)

以下是使用cSplit/dcast的选项。将行分成长&#39;格式为cSplitdcast格式为&#39;宽&#39;格式

library(splitstackshape)
dcast(cSplit(df, c('name','value'), '~', 'long')[!is.na(value)], id ~ paste0('value_', name))
#   id value_A value_B value_C value_D
#1:  1       1       2       3      NA
#2:  2       1      NA      NA       2