2017-05-30 63 views
0

我有一個約561個元素的列表,每個元素都是一個列表,當調用時它看起來像一個矩陣。下面是從數據集的例子,R lapply訪問列表中的元素並執行計算

structure(list(`111110` = structure(c(205, 4, 1, 6, 23, 0, 1, 
0, 0), .Dim = c(3L, 3L), .Dimnames = list(c("1", "4", "5"), c("1", 
"4", "5"))), `111120` = structure(c(181, 3, 4, 4), .Dim = c(2L, 
2L), .Dimnames = list(c("1", "4"), c("1", "4"))), `111130` = structure(c(71, 8, 3, 15, 114, 7, 6, 8, 56), .Dim = c(3L, 3L), .Dimnames = list(
c("1", "4", "5"), c("1", "4", "5"))), `111140` = structure(c(87, 
8, 9, 14), .Dim = c(2L, 2L), .Dimnames = list(c("1", "4"), c("1", 
"4"))), `111150` = structure(24, .Dim = c(1L, 1L), .Dimnames = list(
"1", "1")), `111160` = structure(48, .Dim = c(1L, 1L), .Dimnames = list(
"1", "1"))), .Names = c("111110", "111120", "111130", "111140", 
"111150", "111160")) 

各元素的列表的尺寸是1×1至6×6,我想爲每個列表中的元素執行以下計算:

  1. 如果條目有一個名爲「5」的列,那麼我想總結列「5」中的條目,除了列「5」的最後一行中的條目之外。如果沒有列「5」,那麼計算應該是空白的。

  2. 如果條目有一個名爲「5」的列,那麼列「1」中的元素總和除外,第一個元素除外。如果關聯的條目沒有包含「5」作爲其標題的列,則它應該是空白的。

  3. 採取的計算部分1和2,並將它們添加到一個數據幀包含唯一ID和從1計算和2

我曾嘗試以下(基於所提供的答案如下圖):

output <- c() 
for(x in names(trans.by.naics)) { 
    id <- x 
    count.entry.5 <- ifelse("5" %in% colnames(trans.by.naics[[x]]), 
          sum(trans.by.naics[[x]][1 :nrow(trans.by.naics[[x]]), 5]) - trans.by.naics[[x]][5,5], "") # sum down the first four rows of column "5" if it exists 
    count.entry.1 <- ifelse("5" %in% colnames(trans.by.naics[[x]]), 
        sum(trans.by.naics[[x]][1 : nrow(trans.by.naics[[x]]), 1]) - trans.by.naics[[x]][1,1], "") 
    thing <- data.frame(id, count.entry.5, count.entry.1) 
    output <- rbind(output, thing) 

} 

,但我得到以下運行我的代碼:

Error in trans.by.naics[[x]][1:nrow(trans.by.naics[[x]]), 5] : 
    subscript out of bounds 

期望的輸出如下所示:

 id count.entry.5 count.entry.1 
1 111110    1    5 
2 111120       3 
3 111130   14   11 
4 111140        
5 111150        
6 111160 

是否有一種很好的方法可以做到這一點,不會花太長時間?也許更加矢量化的方法? lapply方法?任何意見或幫助表示讚賞。謝謝!!

+1

https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – AidanGawronski

+0

@AidanGawronski非常感謝我不知道'dput的力量'舉例來說。 – jvalenti

回答

1
output <- c() 
for (x in names(data)) { 
    id <- x 
    if(sum(colnames(data[[x]]) %in% "5") == 1) { 
    calc1 <- sum(data[[x]][-nrow(data[[x]]), "5"]) 
    calc2 <- sum(data[[x]][-1, "1"]) 
    } else { 
    calc1 <- NA 
    calc2 <- NA 
    } 
    thing <- data.frame(id, calc1, calc2) 
    output <- rbind(output, thing) 
} 
+0

您的數據的第二個元素沒有列「5」...所以輸出不完全相同,但它會按照您的要求進行操作。 – AidanGawronski

+0

我不太理解這一行......'if(sum(colnames(data [[x]]%in%「5」)== 1' line。爲什麼總結列名? – jvalenti

+0

我問,因爲在6×6的情況下,對於calc1的計算是不正確的,即使它在colnames [[data]]中有一個「5」 - 它將列「5」的最後一行加起來 – jvalenti