2017-03-07 91 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 

所以,去與第二種方法;-)