将多列拆分为行
Split multiple columns into rows
我正在处理一组非常原始的数据,需要对其进行整理才能使用它。我正在尝试根据分隔符 '|'
拆分选定的列
d <- data.frame(id = c(022,565,893,415),
name = c('c|e','m|q','w','w|s|e'),
score = c('e','k|e','e|k|e', 'e|o'))
是否可以将数据帧拆分为一个,最后看起来像这样。
df <- data.frame(id = c(22,22,565,565,565,565,893,893,893,415,415,415,415,415,415),
name = c('c','e','m','m','q','q','w','w','w','w','w','s','s','e','e'),
score = c('e','e','k','e','k','e','e','k','e','e','o','e','o','e','o'))
到目前为止,我已经尝试了各种不同的字符串拆分功能,但运气不佳:(
有人可以帮忙吗?
与 dplyr
和 unnest
来自 tidyr
:
library(dplyr)
library(tidyr)
d %>% mutate(name=strsplit(name,split="[|]")) %>%
group_by(id) %>%
unnest() %>%
mutate(score=strsplit(score,split="[|]")) %>%
unnest()
##Source: local data frame [15 x 3]
##Groups: id [4]
##
## id name score
## <dbl> <chr> <chr>
##1 22 c e
##2 22 e e
##3 565 m k
##4 565 m e
##5 565 q k
##6 565 q e
##7 893 w e
##8 893 w k
##9 893 w e
##10 415 w e
##11 415 w o
##12 415 s e
##13 415 s o
##14 415 e e
##15 415 e o
这是一个简单的基础 R 方法,分为两步:
1) 拆分列:
x <- lapply(d[-1], strsplit, "|", fixed = TRUE)
2) 扩展合并:
d2 <- setNames(do.call(rbind, Map(expand.grid, d$id, x$name, x$score)), names(d))
那么结果是:
# id name score
#1 22 c e
#2 22 e e
#3 565 m k
#4 565 q k
#5 565 m e
#6 565 q e
#7 893 w e
#8 893 w k
#9 893 w e
#10 415 w e
#11 415 s e
#12 415 e e
#13 415 w o
#14 415 s o
#15 415 e o
还有2行tidyr
\dplyr
解决方案
tidyr
包有一个名为 separate_rows
的函数,可以满足您的需要。您需要在两个操作中将行分开,并且嵌套元素不相等。
library(tidyr)
library(dplyr)
df <- separate_rows(d, name, sep = "\|") %>%
separate_rows(score, sep = "\|")
我正在处理一组非常原始的数据,需要对其进行整理才能使用它。我正在尝试根据分隔符 '|'
d <- data.frame(id = c(022,565,893,415),
name = c('c|e','m|q','w','w|s|e'),
score = c('e','k|e','e|k|e', 'e|o'))
是否可以将数据帧拆分为一个,最后看起来像这样。
df <- data.frame(id = c(22,22,565,565,565,565,893,893,893,415,415,415,415,415,415),
name = c('c','e','m','m','q','q','w','w','w','w','w','s','s','e','e'),
score = c('e','e','k','e','k','e','e','k','e','e','o','e','o','e','o'))
到目前为止,我已经尝试了各种不同的字符串拆分功能,但运气不佳:(
有人可以帮忙吗?
与 dplyr
和 unnest
来自 tidyr
:
library(dplyr)
library(tidyr)
d %>% mutate(name=strsplit(name,split="[|]")) %>%
group_by(id) %>%
unnest() %>%
mutate(score=strsplit(score,split="[|]")) %>%
unnest()
##Source: local data frame [15 x 3]
##Groups: id [4]
##
## id name score
## <dbl> <chr> <chr>
##1 22 c e
##2 22 e e
##3 565 m k
##4 565 m e
##5 565 q k
##6 565 q e
##7 893 w e
##8 893 w k
##9 893 w e
##10 415 w e
##11 415 w o
##12 415 s e
##13 415 s o
##14 415 e e
##15 415 e o
这是一个简单的基础 R 方法,分为两步:
1) 拆分列:
x <- lapply(d[-1], strsplit, "|", fixed = TRUE)
2) 扩展合并:
d2 <- setNames(do.call(rbind, Map(expand.grid, d$id, x$name, x$score)), names(d))
那么结果是:
# id name score
#1 22 c e
#2 22 e e
#3 565 m k
#4 565 q k
#5 565 m e
#6 565 q e
#7 893 w e
#8 893 w k
#9 893 w e
#10 415 w e
#11 415 s e
#12 415 e e
#13 415 w o
#14 415 s o
#15 415 e o
还有2行tidyr
\dplyr
解决方案
tidyr
包有一个名为 separate_rows
的函数,可以满足您的需要。您需要在两个操作中将行分开,并且嵌套元素不相等。
library(tidyr)
library(dplyr)
df <- separate_rows(d, name, sep = "\|") %>%
separate_rows(score, sep = "\|")