如何在输出中添加列表元素名称作为变量

时间:2017-09-29 23:03:09

标签: r

我有一个data.frames列表如下所示:

$IB1Q
         V1          V2          V3          V4          V5          V6          V7          V8 
0.184011746 0.805070251 0.840738769 0.701748191 0.493042421 0.889981450 0.003934755 0.794561335 
         V9         V10         V11 
0.664718057 0.880357401 0.545795252 

$IBCA
       V1        V2        V3        V4        V5        V6        V7        V8        V9 
0.8719393 0.8177656 0.9205127 0.7200678 0.7456413 0.4643883 0.8006192 0.1430972 0.7622733 
      V10       V11 
0.4716331 0.8681162 

并且每个元素名称(IB1Q,IBCA)传达信息。我想row.bind他们在一起,在我的data.farme我想要一个 列表的变量elemnt每个观察源自。 所以我想获得一个包含2列的data.frame(第一列popID和第二列我的比例):

IB1Q   0.184011746
IB1Q   0.805070251
IB1Q   0.840738769
IB1Q   0.701748191
IB1Q   0.493042421
.
.
.
IBCA   0.4716331
IBCA   0.8681162

3 个答案:

答案 0 :(得分:1)

以下是一个想法:

mylist <- list(
  IB1Q = as.data.frame(setNames(
    list(0.184011746, 0.805070251, 0.840738769, 0.701748191, 0.493042421, 0.889981450, 0.003934755, 0.794561335, 0.664718057, 0.880357401, 0.545795252),
    paste0("V", 1:11)
  )),
  IBCA = as.data.frame(setNames(
    list(0.8719393, 0.8177656, 0.9205127, 0.7200678, 0.7456413, 0.4643883, 0.8006192, 0.1430972, 0.7622733, 0.4716331, 0.8681162),
    paste0("V", 1:11)
  ))
)

do.call(rbind.data.frame,
        lapply(names(mylist), function(n) data.frame(K=n, V=unlist(mylist[[n]], use.names = FALSE)))
        )
#       K           V
# 1  IB1Q 0.184011746
# 2  IB1Q 0.805070251
# 3  IB1Q 0.840738769
# 4  IB1Q 0.701748191
# 5  IB1Q 0.493042421
# 6  IB1Q 0.889981450
# 7  IB1Q 0.003934755
# 8  IB1Q 0.794561335
# 9  IB1Q 0.664718057
# 10 IB1Q 0.880357401
# 11 IB1Q 0.545795252
# 12 IBCA 0.871939300
# 13 IBCA 0.817765600
# 14 IBCA 0.920512700
# 15 IBCA 0.720067800
# 16 IBCA 0.745641300
# 17 IBCA 0.464388300
# 18 IBCA 0.800619200
# 19 IBCA 0.143097200
# 20 IBCA 0.762273300
# 21 IBCA 0.471633100
# 22 IBCA 0.868116200

由于我们要废弃嵌套data.frame的列名,因此我不认为使用unlist过于苛刻/有损。 (我使用use.names=FALSE,因为从长远来看,我发现行名称不可靠......如果您愿意,请随时保留它们。)

答案 1 :(得分:1)

这里不需要循环。您可以使用rep()unlist()

data.frame(
    popID = rep(names(mylist), lengths(mylist)),
    prop = unlist(mylist, use.names=FALSE) # use.names=FALSE for speed
)

lengths()在这里非常有用,因为它为每个列表元素提供了列数。

答案 2 :(得分:0)

这是另一种方法(使用@ r2evans回答中提供的mylist):

library(tidyverse)
bind_rows(mylist, .id = "popID") %>% 
  gather(key, value, -popID) %>% select(-key) %>% arrange(popID)
#>    popID       value
#> 1   IB1Q 0.184011746
#> 2   IB1Q 0.805070251
#> 3   IB1Q 0.840738769
#> 4   IB1Q 0.701748191
#> 5   IB1Q 0.493042421
#> 6   IB1Q 0.889981450
#> 7   IB1Q 0.003934755
#> 8   IB1Q 0.794561335
#> 9   IB1Q 0.664718057
#> 10  IB1Q 0.880357401
#> 11  IB1Q 0.545795252
#> 12  IBCA 0.871939300
#> 13  IBCA 0.817765600
#> 14  IBCA 0.920512700
#> 15  IBCA 0.720067800
#> 16  IBCA 0.745641300
#> 17  IBCA 0.464388300
#> 18  IBCA 0.800619200
#> 19  IBCA 0.143097200
#> 20  IBCA 0.762273300
#> 21  IBCA 0.471633100
#> 22  IBCA 0.868116200