R 将多列拆分为行

R 将多列拆分为行,r,split,strsplit,splitstackshape,R,Split,Strsplit,Splitstackshape,我正在处理一组非常原始的数据,需要对其进行塑形以处理它。我正在尝试根据分隔符“|” 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')) d带有dplyr和unest来自tidyr: library(dplyr) library(tidyr) d %>% mutate(name=strspl

我正在处理一组非常原始的数据,需要对其进行塑形以处理它。我正在尝试根据分隔符
“|”

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

d带有
dplyr
unest
来自
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
库(dplyr)
图书馆(tidyr)
d%>%突变(name=strsplit(name,split=“[|]”))%>%
分组依据(id)%>%
unest()%>%
变异(分数=strsplit(分数,split=“[|]”)%>%
unnest()
##来源:本地数据帧[15 x 3]
##组别:id[4]
##
##id名称分数
##     
##1 22 c e
##222E
##3565MK
##东经4565米
##5565QK
##6565 q e
##西7 893
##8 893 w k
##西9 893
##东经10415
##11415 w o
##东经12415
##13415南澳
##14415东
##15415东

这里有一个简单的base R方法,分为两步:

1) 拆分列:

x <- lapply(d[-1], strsplit, "|", fixed = TRUE)

还有两行
tidyr
\
dplyr
解决方案

tidyr
软件包有一个名为
separate_rows
的函数,它可以满足您的需要。在嵌套元素不相等的两个操作中,需要两个单独的行

library(tidyr)
library(dplyr)

df <- separate_rows(d, name, sep = "\\|") %>%
separate_rows(score, sep = "\\|")
library(tidyr)
图书馆(dplyr)
df%
分隔行(分数,sep=“\\\\”)

另外,只需使用双
cSplit
库(splitstackshape);cSplit(cSplit(d,'name',sep='|','long'),'score',sep='|','long')
将引入一个名为
cartesian_split()
的函数,该函数可以用作
cartesian_split(d,c(“name”,“score”),“[|]”,fixed=FALSE)
。谢谢,我在手机上没有看到这个!如果我有1000多列呢?
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
library(tidyr)
library(dplyr)

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