我有一个大约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)
}
但是当我运行代码时,我得到以下内容:
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
方式?任何建议或帮助表示赞赏。谢谢!!
答案 0 :(得分: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)
}