我有一个数据框,如下所示,显示了某些公司的价值取决于一年:
# company year value1 value2
# 1 1 2019 1 10
# 2 1 2020 11 110
# 3 1 2021 111 1110
# 4 2 2019 2 20
# 5 2 2021 222 2220
# 6 3 2019 3 30
# 7 3 2020 33 330
# 8 3 2021 333 3330
字符串
公司2在2020年的价值缺失。现在我想总结一下每个公司在某一年的价值,例如。2020年:
df_sum <- data.frame()
for (i in 1:3) {
# number of the company
df_sum[i, 1] <- i
# sum of the company's values
df_sum[i, 2] <- df[df$company == i & df$year == 2020, "value1"] +
df[df$company == i & df$year == 2020, "value2"]
}
型
R给出输出
xjj[iseq] <中出错- replacement的长度为零
因为公司2缺少2020的值,因此for循环终止。
我如何实现缺失值被视为“NA + NA = NA”(即:df_sum[2,2] is NA)”并且for循环不会终止?
数据框df_sum应该看起来像这样:
company | sum of values
-------------------------
1| 1 | 121
2| 2 | NA
3| 3 | 363
型
数据
df <- structure(list(company = c(1, 1, 1, 2, 2, 3, 3, 3), year = c(2019,
2020, 2021, 2019, 2021, 2019, 2020, 2021), value1 = c(1, 11,
111, 2, 222, 3, 33, 333), value2 = c(10, 110, 1110, 20, 2220,
30, 330, 3330)), class = "data.frame", row.names = c(NA, -8L))
型
2条答案
按热度按时间5vf7fwbs1#
首先,我认为jay.sf的答案更简洁,对我来说可能是一个更好(或更有效)的选择。然而,我已经写了下面的内容,所以我想我可能会与我的替代品。
选项1:要按原样使用for循环(几乎),您需要生成缺失的数据并使用NA填充它,例如使用嵌套循环。(我还将sum()改为+来对值求和)
字符串
选项2:使用类似的嵌套循环一次对所有年份求和
型
希望有助于更明确地了解发生了什么,但有更有效的方法来完成这类事情
nfzehxib2#
公司2在2020年没有观测值,所以你想分配给
df_sum[i, 2] <-
的长度为零,这就是错误所抱怨的。你可以考虑处理一个
if/else
子句的情况,在这里我们分配NA_real
if
,没有any
观察。字符串
如果没有
for
循环(在R中相当慢),你可以将cbind
公司转换为rowSums
两个值,到2020年将其子集化,并将merge
公司转换为unique
公司。型