将列表分成行,同时在r中保留标识符

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).非常感谢!

akr*_*run 7

你可以用 melt

library(reshape2)
melt(lapply(setNames(list, names), function(x)
                      unlist(strsplit(x, ', | |,'))))
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 5

这是一个可能的基础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)


kon*_*vas 2

以下是如何使用 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))到命令链中。)