将多列拆分为行

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'))

到目前为止,我已经尝试了各种不同的字符串拆分功能,但运气不佳:(

有人可以帮忙吗?

dplyrunnest 来自 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 = "\|")