在R中,我有森林覆盖百分比的子区域,我想找到由这些小流域组成的较大流域的森林覆盖百分比。
数据如下所示:
df
W_ID sub_area w_area sub_forest
1 500 3045 15.5
1 650 3045 0
1 700 3045 32.4
1 645 3045 50.1
1 550 3045 16.9
2 480 2720 0.9
2 560 2720 18.5
2 760 2720 80.5
2 820 2720 18.6
我尝试使用dplyr
df %>%
group_by(W_ID)%>%
summarise(forest=(sum(sub_area*sub_forest)/w_area))
但它返回此错误代码
Error in summarise_impl(.data, dots) : expecting a single value
使用mutate的类似方法不会返回错误,但它返回 n 子流域的森林覆盖的 n 值,而我只想要 m m 分水岭ID的森林覆盖的唯一值。
df %>%
group_by(W_ID)%>%
mutate(forest=(sum(sub_area*sub_forest)/w_area))
如何正确使用汇总来获取每个W_ID的%林覆盖?
答案 0 :(得分:2)
我们需要更改sum
的括号以执行sum
比例而非sum
的产品除以'w_area'
df %>%
group_by(W_ID) %>%
summarise(forest = sum(sub_area * sub_forest/w_area))
# W_ID forest
# <int> <dbl>
#1 1 23.65829
#2 2 32.06765
答案 1 :(得分:0)
问题的根源是w_area
是长度大于1的向量。对于整个组具有相同的值无关紧要,2 / c(1, 1, 1)
是2 2 2
您可以在评论和其他答案中移动总和内的部门。这是有效的,因为除法在一个总和上分配。
另一个选项 - 更通用的选项 - 是使用w_area
的函数返回单个值,比如first(w_area)
或w_area[1]
。 安全方法是使用unique()
,如果只有一个不同的值,它将返回单个元素,但如果您有不同的w_area
,则会抛出此错误同一组中的值,可能会提醒您错误的假设或早期的错误。