2017-03-07 96 views
0

我正在使用来自RStudio的reticulate R包运行一些python代码以将ROOT(http://root.cern.ch)中的数据转换为R.我的问题是python代码返回一个行列表列表。例如,在蟒蛇,将未命名条目列表转换为数据框或tibble

[[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], 
...] 

这些数据都被转换为通过reticulate 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) 

我到处找我能想到的,我无法找到一个将这些数据转化为数据框的方式(我真的想要一个小窍门)。一个问题似乎是列表条目未被命名。有很多数据,所以我不想做一些效率低下的事情。我可以让Python代码返回一个字典的字典,这将工作。但是创建行的python代码非常简单。

如果有一个简单的方法把这些逐行列出成数据帧,这将是理想的。有任何想法吗?

+0

你试过'bind_rows'? –

+1

也许像'as.data.frame(lapply(1:14,函数(X)sapply(LL,函数(y)的Y [[X]])),col.names = paste0( “V”,1: 14))'(其中'LL'是你'136972个值list' – A5C1D2H2I1M1N2O1R2T1

+0

由于这一工程,是不是太慢了我都试过, DF <! - 。as.data.frame(do.call(rbind ,myList中),col.names = colnames) 后来我结束了一个数据帧,其中列有清单。有没有一种方法,使这项工作? – Adam

回答

1

这里有一些办法来考虑:

  • 选项1:我们知道有多少项目是在子列表(有多少列预期)。循环浏览列表,从子列表中的每个相关元素创建一个新列表。裹在as.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))) 
    } 
    
  • 选项2.使用do.call(rbind, .)然后unlist每列作普通data.frame没有list列。

    myFun_2 <- function(inlist) { 
        x <- as.data.frame(do.call(rbind, inlist)) 
        x[] <- lapply(x, unlist) 
        x 
    } 
    

让我们来测试这些了一些样本数据。这里有一个list应该创建一个矩形3行×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)) 

下面是这个大些的版本,这将通过14列数据集创建经15万行。

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 

所以,去与第二种方法;-)