R访问列表的元素并执行计算

R访问列表的元素并执行计算,r,matrix,sum,lapply,R,Matrix,Sum,Lapply,我有一个大约561个元素的列表,每个元素都是一个调用时看起来像矩阵的列表。下面是数据集中的一个示例 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),

我有一个大约561个元素的列表,每个元素都是一个调用时看起来像矩阵的列表。下面是数据集中的一个示例

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 x 1到6 x 6。我想对列表中的每个元素进行以下计算:

如果条目有一个名为5的列,那么我想对第5列中的条目求和,第5列最后一行中的条目除外。如果没有第5列,则计算应为空

如果条目有一个名为5的列,则对第1列中的元素求和,第一个元素除外。如果关联条目没有标题为5的列,则该列应为空

将第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)

}
所需的输出如下所示:

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

有没有一种不需要太长时间的好方法?也许是更矢量化的方法?一种迂回的方法?任何建议或帮助都将不胜感激。谢谢

@AidanGawronski非常感谢。例如,我不知道dput的威力。您数据的第二个元素没有第5列。。。因此,输出不完全相同,但它会按照您的要求执行。我不太理解%5==1行中的行…ifsumcolnamesdata[[x]]]%。为什么要对列名求和?我这样问是因为在6 X 6的情况下,calc1的计算是不正确的,即使它在colnames[[data]]中有一个5-它将第5列的最后一行相加。几个FALSE的和是0,但如果其中任何一个是5,则TRUE将和为1。把6 x 6和你想要的输出相加。啊,我明白了。聪明干净。我解释了6x6病例:calc1
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)
}
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)
}