【发布时间】:2021-12-29 14:34:51
【问题描述】:
我有一个数据框,其中有很多很多 NA 值散布在感兴趣的列之间。这是一个示例:
dput(try[, 30:34])
structure(list(adj_avg_2016 = c(25641966.4, 28919805, 44152549.8,
4341304.9, 10588244.8, 4928398.6, 8985362.4, 832000, 2674875.2,
20416846.8), adj_avg_2017 = c(27693728, 29815155, 46187854.8,
4594589.9, 11021124.8, 5075010, 9436240.8, 848640, 2782821.6,
21439365.4), adj_avg_2018 = c(31554678.4, 30710505, 45952664,
NA, NA, NA, NA, 865920, 2894427.2, 21556703.6), adj_avg_2019 = c(33454832,
31605855, 45590832, NA, 12319764.8, NA, NA, 900480, NA,
21556703.6), adj_avg_2020 = c(35122520, 32501205, 46495412, NA,
NA, NA, NA, NA, 3130445.6, 22520553.1)), class = "data.frame", row.names = c(NA,
10L))
我想做的是根据使用列索引的条件对数据框try 中的每一列求和。
更具体地说,我想查看上一年的列并仅使用当前和上一年列中非 NA 的元素求和。例如
- 对于 col
adj_avg_2016,我想对所有元素求和,因为它是组中的第一列 - 对于 col
adj_avg_2017,我想对所有元素求和 因为其中或adj_avg_2016列中没有 NA 值。 - 对于 col
adj_avg_2018,我只想使用adj_avg_2017或adj_avg_2018中不是NA的 对应 条目求和(因此条目 1:3、8: 10) - 对于 col
adj_avg_2019,我想使用条目 1:3、8 和 10 求和 因为adj_avg_2018中的条目 5 是 NA,adj_avg_2019中的条目 9 是 NA - 对于 col
adj_avg_2020,我想仅使用条目 1:3 和 10 求和,因为adj_avg_2019中的条目 9 为空。
我想要的结果是每一年的列,agg_pass1_2016...agg_pass1_2020 包含指定的计算。
由于数据框每年都会继续增长,而且我会经常这样做,因此函数似乎是要走的路。到目前为止,这是我想出的:
str <- function(df, overwrite = TRUE){
nms <- grep("adj_avg_[0-9]+$", names(df), value = TRUE) # get the columns
nms_col_idx <- grep("adj_avg_[0-9]+$", names(df), value = FALSE) # get the column indexes
revnms <- gsub("adj_avg", "agg_pass1", nms) # names of new columns I want to add
if(!overwrite) revnms <- setdiff(revnms, names(df))
df[, revnms] <- lapply(df[, nms], sum, ....) # This is where I get confused.
}
我的问题/疑问:
-
在上述函数中将行和列索引合并到
df[, revnms]中以实现所需计算的最佳方法是什么?我知道一种方法会涉及which(!is.na(.))的某种组合,但我不确定如何将其放入最后一行的函数中。 -
还有其他函数可以像函数一样快速简单地实现我的结果吗?
欢迎所有 cmets/建议。非常感谢。
【问题讨论】:
-
这不就是
colSums(try, na.rm = TRUE) -
至少在您的示例中,似乎可以连续引入
NA值,但它们永远不会消失,因此 akrun 的建议看起来会很好。如果您的真实数据不是这种情况,我建议您编辑您的问题以提供更真实的示例。 -
@akrun 我已经更新了样本数据以更好地反映我想要的结果。谢谢指出
-
基于这个逻辑
elements that are non-NA in both the current and previous year column.最后一个应该是1-3和10?因为 9 在adj_avg_2019中是 NA?