我有一种格式来分隔我将拥有此数据的位置:
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
答案 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;格式为cSplit
且dcast
格式为&#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