R 将包含未命名项的列表列表转换为数据帧或TIBLE

R 将包含未命名项的列表列表转换为数据帧或TIBLE,r,tidyr,R,Tidyr,我正在使用RStudio的networkiteR包来运行一些python代码,将ROOT()中的数据带入R。我的问题是python代码返回一个行列表。例如,在python中 [[0L, 0L, 'mu+', 1, 0, 0, 1, 3231.6421853545253, -17.361063509909364, 6322.884067996471, -2751.857298366544, 1.2318766603937736, 1407.9560948453036, 3092.931322317

我正在使用RStudio的
networkite
R包来运行一些python代码,将ROOT()中的数据带入R。我的问题是python代码返回一个行列表。例如,在python中

[[0L, 0L, 'mu+', 1, 0, 0, 1, 3231.6421853545253, -17.361063509909364, 6322.884067996471, -2751.857298366544, 1.2318766603937736, 1407.9560948453036, 3092.931322317615], 
[0L, 0L, 'nu_e', 3, 1, 0, 0, 3231.6421853545253, -17.361063509909364, 6322.884067996471, -743.6755000649275, 9.950229845741603, 342.4203222294634, 818.781981693865], 
[0L, 0L, 'anti_nu_mu', 2, 1, 0, 0, 3231.6421853545253, -17.361063509909364, 6322.884067996471, -808.1114666690765, 21.680955968349267, 445.2784282520303, 922.9231198102832],
...]
这些数据通过
networkite
转换为R中相应的列表

List of 136972
$ :List of 14
..$ : int 0
..$ : int 0
..$ : chr "mu+"
..$ : int 1
..$ : int 0
..$ : int 0
..$ : int 0
..$ : num 7162
..$ : num -0.0108
..$ : num -627
..$ : num 264
..$ : num -3.24
..$ : num 3080
..$ : num 3093
$ :List of 14
..$ : int 0
..$ : int 0
..$ : chr "mu+"
..$ : int 1
.... (you get the idea)
我已经搜索了所有我能想到的地方,但我找不到将这些数据转换为数据帧的方法(我真的想要一个tibble)。一个问题似乎是列表条目没有命名。有很多数据,所以我不想做一些低效的事情。我可以让python代码返回一个列字典,这样就行了。但是生成一行的python代码要简单得多


如果有一种简单的方法将这些行列表转换为数据帧,那将是理想的。有什么想法吗?

以下是我想到的几种方法:

  • 选项1:我们知道子列表中有多少项(预计有多少列)。在列表中循环,使用子列表中的每个相关元素创建一个新列表。把它包装成.data.frame,就完成了

    myFun_1 <- function(inlist, expectedCols = 14) {
      as.data.frame(
        lapply(sequence(expectedCols), 
               function(x) {
                 sapply(inlist, function(y) y[[x]])
                }),
        col.names = paste0("V", sequence(expectedCols)))
    }
    
让我们用一些样本数据来测试这些。下面是一个
列表
,它应该创建一个3行x 14列的矩形数据集:

LL <- list(
  list(0L, 0L, 'mu+', 1, 0, 0, 1, 3231.6421853545253, -17.361063509909364,
       6322.884067996471, -2751.857298366544, 1.2318766603937736, 
       1407.9560948453036, 3092.931322317615),
  list(0L, 0L, 'nu_e', 3, 1, 0, 0, 3231.6421853545253, -17.361063509909364,
       6322.884067996471, -743.6755000649275, 9.950229845741603, 
       342.4203222294634, 818.781981693865),
  list(0L, 0L, 'anti_nu_mu', 2, 1, 0, 0, 3231.6421853545253, 
       -17.361063509909364, 6322.884067996471, -808.1114666690765, 
       21.680955968349267, 445.2784282520303, 922.9231198102832))
看起来都不错。现在,性能如何

system.time(myFun_1(Big_LL))
##    user  system elapsed 
##    2.65    0.05    2.75 

system.time(myFun_2(Big_LL))
##    user  system elapsed 
##    0.41    0.00    0.40 


那么,使用第二种方法;-)

您是否尝试过
bind_rows
?可能类似于
as.data.frame(lappy(1:14,function(x)sapply(LL,function(y)y[[x]])),col.names=paste0(“V”,1:14))
(其中
LL
是您的136972个值的
列表。谢谢!这很有效,速度也不太慢。我已经尝试过,df
Big_LL <- unlist(replicate(50000, LL, FALSE), FALSE)
myFun_1(LL)
##   V1 V2         V3 V4 V5 V6 V7       V8        V9      V10        V11       V12
## 1  0  0        mu+  1  0  0  1 3231.642 -17.36106 6322.884 -2751.8573  1.231877
## 2  0  0       nu_e  3  1  0  0 3231.642 -17.36106 6322.884  -743.6755  9.950230
## 3  0  0 anti_nu_mu  2  1  0  0 3231.642 -17.36106 6322.884  -808.1115 21.680956
##         V13       V14
## 1 1407.9561 3092.9313
## 2  342.4203  818.7820
## 3  445.2784  922.9231

myFun_2(LL)
##   V1 V2         V3 V4 V5 V6 V7       V8        V9      V10        V11       V12
## 1  0  0        mu+  1  0  0  1 3231.642 -17.36106 6322.884 -2751.8573  1.231877
## 2  0  0       nu_e  3  1  0  0 3231.642 -17.36106 6322.884  -743.6755  9.950230
## 3  0  0 anti_nu_mu  2  1  0  0 3231.642 -17.36106 6322.884  -808.1115 21.680956
##         V13       V14
## 1 1407.9561 3092.9313
## 2  342.4203  818.7820
## 3  445.2784  922.9231
system.time(myFun_1(Big_LL))
##    user  system elapsed 
##    2.65    0.05    2.75 

system.time(myFun_2(Big_LL))
##    user  system elapsed 
##    0.41    0.00    0.40