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