将多个列拆分为多行

4

我正在处理一组非常原始的数据,需要对其进行整理以便于使用。我试图根据分隔符'|'拆分所选列。

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

到目前为止,我尝试了各种不同的字符串分割函数,但都没有太大的成功 :(

有人能帮忙吗?


另外,https://dev59.com/P2Yr5IYBdhLWcg3wTYq4 - zx8754
1
只需使用双重 cSplitlibrary(splitstackshape); cSplit(cSplit(d, 'name', sep = '|', 'long'), 'score', sep = '|', 'long') - Jaap
1
V2 of "splitstackshape" 将引入一个名为 cartesian_split() 的函数,可以使用 cartesian_split(d, c("name", "score"), "[|]", fixed = FALSE) 进行调用。 - A5C1D2H2I1M1N2O1R2T1
3个回答

7

以下是两步基本的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

4

还有一种包含tidyrdplyr的解决方案。

tidyr包含一个名为separate_rows的函数,可以完成您需要的操作。您需要进行两个操作来分离两行,其中嵌套元素不相等。

library(tidyr)
library(dplyr)

df <- separate_rows(d, name, sep = "\\|") %>%
separate_rows(score, sep = "\\|")

谢谢,手机上没看到! - Jake Kaupp
如果我有超过1000列怎么办? - Rushabh Patel

1
使用 dplyrtidyr 中的 unnest

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接