Chr*_*ail 10 regex r list reshape
我正在使用以下类型的数据集
names<-c("Aname","Aname","Bname","Cname","Cname")
list <- list( c('a, b','b, r','c, g'), c('d,g','e,j'),
c('d, h','s, q','f,q'), c('d,r ','s, z'),c('d, r','d, r'))
data<-cbind(names, list)
Run Code Online (Sandbox Code Playgroud)
并希望打破列表中的每个元素,然后将其与"name"变量绑定.所以我想要生成的数据集看起来像这样:
Column 1 Column 2
Aname a
Aname b
Aname b
Aname r
Aname c
Run Code Online (Sandbox Code Playgroud)
有很多关于如何将列表转换为data.frame的讨论,但是我很难找到关于如何在"数据框内"执行此操作的任何建议,我希望将标识符保存在同一行中.列表(在本例中为Names).非常感谢!
你可以用 melt
library(reshape2)
melt(lapply(setNames(list, names), function(x)
unlist(strsplit(x, ', | |,'))))
Run Code Online (Sandbox Code Playgroud)
这是一个可能的基础R解决方案
myFunc <- function(x) unlist(strsplit(unlist(x), ", | |,"))
data.frame(Col1 = rep(names, sapply(list, function(x) length(myFunc(x)))),
Col2 = myFunc(list))
# Col1 Col2
# 1 Aname a
# 2 Aname b
# 3 Aname b
# 4 Aname r
# 5 Aname c
# 6 Aname g
# 7 Aname d
# 8 Aname g
# 9 Aname e
# 10 Aname j
# 11 Bname d
# 12 Bname h
# 13 Bname s
# 14 Bname q
# 15 Bname f
# 16 Bname q
# 17 Cname d
# 18 Cname r
# 19 Cname s
# 20 Cname z
# 21 Cname d
# 22 Cname r
# 23 Cname d
# 24 Cname r
Run Code Online (Sandbox Code Playgroud)
以下是如何使用 dplyr/tidyr 进行此操作。这个想法是将每个元素转换list为列表本身(从当前的字符向量),然后调用非常有用的unnest函数
library(dplyr)
library(tidyr)
data.frame(data) %>%
unnest(list) %>%
mutate(list = strsplit(list, ",")) %>%
unnest(list)
# names list
#1 Aname a
#2 Aname b
#3 Aname b
#4 Aname r
#5 Aname c
#6 Aname g
#7 Aname d
#8 Aname g
#9 Aname e
#10 Aname j
#11 Bname d
#12 Bname h
#13 Bname s
#14 Bname q
#15 Bname f
#16 Bname q
#17 Cname d
#18 Cname r
#19 Cname s
#20 Cname z
#21 Cname d
#22 Cname r
#23 Cname d
#24 Cname r
Run Code Online (Sandbox Code Playgroud)
(如果需要,要删除多余的空格,您可以附加%>% mutate(list = gsub(" ", "", list))到命令链中。)