数据框df_biodiv含有Year、Area和CropName列定义向量列vanishvarity利用dplyr按Year分组计算每个CropName的总Area同一年有多个相同的CropName计算当年每个CropName总Area小于5的CropName数量
可以按如下步骤进行操作:
- 定义向量列vanishvarity,初始值为0。
vanishvarity <- rep(0, nrow(df_biodiv))
- 使用dplyr按Year分组,计算每个CropName的总Area,并将结果保存到新的数据框df_sum中。
library(dplyr)
df_sum <- df_biodiv %>%
group_by(Year, CropName) %>%
summarise(TotalArea = sum(Area))
- 计算当年每个CropName总Area小于5的CropName数量,并将结果保存到vanishvarity中。
for (i in unique(df_biodiv$Year)) {
df_temp <- df_sum %>%
filter(Year == i) %>%
group_by(CropName) %>%
summarise(TotalArea = sum(TotalArea))
vanishvarity[df_biodiv$Year == i & df_biodiv$CropName %in% df_temp$CropName[df_temp$TotalArea < 5]] <- length(unique(df_temp$CropName[df_temp$TotalArea < 5]))
}
解释一下上述代码的逻辑:
- 首先使用for循环遍历每个年份;
- 然后使用filter函数筛选出当前年份的数据,并按CropName分组计算总Area;
- 接着使用summarise函数计算每个CropName的总Area,并筛选出总Area小于5的CropName;
- 最后使用length函数计算小于5的CropName数量,并将结果保存到vanishvarity中。
注意事项:
- 上述代码未考虑当年不存在小于5的CropName的情况,需要根据实际情况进行调整;
- 上述代码使用了for循环,效率可能较低,可以考虑使用dplyr的group_map函数进行优化
原文地址: https://www.cveoy.top/t/topic/dwMm 著作权归作者所有。请勿转载和采集!