R 将给定列表转换为数据帧

R 将给定列表转换为数据帧,r,R,我有以下清单: $id1 $id1[[1]] A B "A" "B" $id1[[2]] A B "A" "A1" $id2 $id2[[1]] A B "A2"

我有以下清单:

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
以R-pastable形式:

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
dat = structure(list(SampleTable = structure(list(id2 = list(structure(c("90", "7"), .Names = c("T", "G")), structure(c("90", "8"), .Names = c("T", "G"))), id1 = structure(c("1", "1"), .Names = c("T", "G"))), .Names = c("id2", "id1"))), .Names = "SampleTable") 
我希望将此给定列表转换为以下数据帧:

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
id1   A    B
id1   A    A1 
id2   A2   B2 

注意!我无法让melt and cast处理这种不规则的数据(我尝试了一个多小时…),我将在这里留下这个答案,以表明对于这种操作,也可以使用重塑包装

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
使用vincent的示例数据,您可以使用重塑包中的melt and cast:

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
library(reshape)
res = cast(melt(d))[-1]
names(res) = c("id","x","y")
res
   id x y
1 id1 1 1
2 id2 3 3
3 id3 5 5
4 id1 2 2
5 id2 4 4
6 id3 6 6

结果data.frame中的顺序不同,但结果相同。代码稍微短一点。我使用
[-1]
删除同样由
melt
返回的第一列。此附加变量是列表列表中各个data.frames的列索引。只需看一下熔化(d)的结果,希望能让它更清楚。

注意!我无法让melt and cast处理这种不规则的数据(我尝试了一个多小时…),我将在这里留下这个答案,以表明对于这种操作,也可以使用重塑包装

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
使用vincent的示例数据,您可以使用重塑包中的melt and cast:

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
library(reshape)
res = cast(melt(d))[-1]
names(res) = c("id","x","y")
res
   id x y
1 id1 1 1
2 id2 3 3
3 id3 5 5
4 id1 2 2
5 id2 4 4
6 id3 6 6
结果data.frame中的顺序不同,但结果相同。代码稍微短一点。我使用
[-1]
删除同样由
melt
返回的第一列。此附加变量是列表列表中各个data.frames的列索引。只需看一下melt(d)的结果,希望能让它更清楚。

您的数据结构(显然是1行数据.frames的未命名列表的命名列表)有点复杂:最简单的方法可能是使用循环来构建data.frames

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
可以使用
do.call
lappy
rbind
直接执行,但即使您熟悉这些函数,也不太容易阅读

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
# Sample data 
d <- list(
  id1 = list(
    data.frame( x=1, y=1 ),
    data.frame( x=2, y=2 )
  ),
  id2 = list(
    data.frame( x=3, y=3 ),
    data.frame( x=4, y=4 )
  ),
  id3 = list(
    data.frame( x=5, y=5 ),
    data.frame( x=6, y=6 )
  )
)

# Convert
d <- data.frame(
  id=rep(names(d), unlist(lapply(d,length))),
  do.call( rbind, lapply(d, function(u) do.call(rbind, u)) )
)
#示例数据
d您的数据结构(显然是1行data.frames的未命名列表的命名列表)有点复杂:最简单的方法可能是使用循环来构建data.frames

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
可以使用
do.call
lappy
rbind
直接执行,但即使您熟悉这些函数,也不太容易阅读

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
# Sample data 
d <- list(
  id1 = list(
    data.frame( x=1, y=1 ),
    data.frame( x=2, y=2 )
  ),
  id2 = list(
    data.frame( x=3, y=3 ),
    data.frame( x=4, y=4 )
  ),
  id3 = list(
    data.frame( x=5, y=5 ),
    data.frame( x=6, y=6 )
  )
)

# Convert
d <- data.frame(
  id=rep(names(d), unlist(lapply(d,length))),
  do.call( rbind, lapply(d, function(u) do.call(rbind, u)) )
)
#示例数据

这是一个有点混乱,你让。
dat
对象上方有一个额外的“层”,因此使用
dat[[1]]

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
dfrm <- data.frame(dat[[1]], stringsAsFactors=FALSE)
names(dfrm) <- sub("\\..+$", "", names(dfrm))

> dfrm
  id2 id2 id1
T  90  90   1
G   7   8   1
> t(dfrm)
    T    G  
id2 "90" "7"
id2 "90" "8"
id1 "1"  "1"
dfrmt(dfrm)
T G
id2“90”“7”
id2“90”“8”
id1“1”“1”

你说的有点乱。
dat
对象上方有一个额外的“层”,因此使用
dat[[1]]

$id1
$id1[[1]]
         A              B               
        "A"            "B"                
$id1[[2]]
         A             B 
        "A"           "A1" 
$id2
$id2[[1]]
         A              B               
        "A2"           "B2" 
dfrm <- data.frame(dat[[1]], stringsAsFactors=FALSE)
names(dfrm) <- sub("\\..+$", "", names(dfrm))

> dfrm
  id2 id2 id1
T  90  90   1
G   7   8   1
> t(dfrm)
    T    G  
id2 "90" "7"
id2 "90" "8"
id1 "1"  "1"
dfrmt(dfrm)
T G
id2“90”“7”
id2“90”“8”
id1“1”“1”


duplicate?@PaulHiemstra是的,我认为它应该作为一个副本关闭。嗯,不完全是这样,数据结构与我提到的副本有点不同。你是对的,需要另一个lapply。我收回我关于结案的陈述。文斯的答案也很准确。我有一个额外的答案,使用熔化和铸造,这对文森特的答案有效。我正试图删除我以前的答案。简言之,这是“铸造(熔化(d))[-1]”复制品?@PaulHiemstra是的,我认为它应该作为复制品关闭。嗯,不完全是这样,数据结构与我提到的复制品有点不同。你是对的,需要另一个重叠。我收回我关于结案的陈述。文斯的答案也很准确。我有一个额外的答案,使用熔化和铸造,这对文森特的答案有效。我正试图删除我以前的答案。简言之,这是“铸造(熔化(d))[-1]”你能把它标记为正确答案吗?这是我答案左侧的灰色记号,就在上下箭头和0的下方。这会让人们知道您的问题已经得到了回答,并且会遇到一些代表;)。如果这更有帮助的话,也可以将另一个答案标记为正确答案。在运行NNING res=cast(melt(d))[-1]之后,我收到了一条消息错误:铸造公式包含熔融数据中未找到的变量:变量正如我在上面的注释中所说的,我无法使用您的数据,只有文森特的第一个例子。你能把它标记为正确答案吗?这是我答案左侧的灰色记号,就在上下箭头和0的下方。这会让人们知道您的问题已经得到了回答,并且会遇到一些代表;)。如果这更有帮助的话,也可以将另一个答案标记为正确答案。在运行NNING res=cast(melt(d))[-1]之后,我收到了一条消息错误:铸造公式包含熔融数据中未找到的变量:变量正如我在上面的注释中所说的,我无法使用您的数据,只有文森特的第一个例子。@Sjan如果你认为这个答案解决了你的问题,请随意检查答案分数下面的灰色标记。问题仍然没有解决。当列表中包含一个列表元素时,问题就出现了。@Sjan:您能提供一个可复制的示例吗,例如,数据结构上的dput()的结果?结构(列表(SampleTable=structure)(列表(id2=list)(structure)(c(“90”,“7”),.Names=c(“T”,“g”)),结构(c(“90”,“8”),.Names=c(“T”,“g”)),id1=structure(c(“1”,“1”),.Names=c(“T”),.Names=c(“id2”、“id1”),.Names=“SampleTable”)最好将此添加到您的问题中。@Sjan如果您认为此答案解决了您的问题,请随意检查答案分数下面的灰色标记。问题仍然没有解决。当列表中包含列表元素时,问题就会出现。@Sjan:您能提供一个可复制的示例,例如,数据结构?结构上dput()的结果吗(list)(SampleTable=structure(list)(id2=list(structure)(c(“90”,“7”),.Names=c(“T”,“G”)),structure(c(“90”,“8”),.Names=c(“T”,“G”)),id1=structure(c(“1”,“1”),.Names=c(“T”,“G”),.Names=c(“id2”,“id1”)),.Names=c(“id2”,“id1”)),.Names=“SampleTable”)会更好