r-dplyr:返回多个值的组的加权和错误
在R中,我有森林覆盖率为%的子流域,我想找到由这些子流域组成的较大流域的森林覆盖率% 数据如下所示:r-dplyr:返回多个值的组的加权和错误,r,dplyr,R,Dplyr,在R中,我有森林覆盖率为%的子流域,我想找到由这些子流域组成的较大流域的森林覆盖率% 数据如下所示: df W_ID sub_area w_area sub_forest 1 500 3045 15.5 1 650 3045 0 1 700 3045 32
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个流域ID返回m个唯一的森林覆盖率值
df %>%
group_by(W_ID)%>%
mutate(forest=(sum(sub_area*sub_forest)/w_area))
如何正确使用Summary来获得每个W_ID的森林覆盖率?我们需要更改
sum
的括号,以进行比例的sum
,而不是sum
除以“W_面积”的乘积
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
df%>%
分组依据(W_ID)%>%
总结(森林=总和(亚区*亚区森林/w区))
#W_ID森林
#
#1 1 23.65829
#2 2 32.06765
我们需要更改sum
的括号,以进行比例的sum
,而不是sum
除以“w_面积”
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
df%>%
分组依据(W_ID)%>%
总结(森林=总和(亚区*亚区森林/w区))
#W_ID森林
#
#1 1 23.65829
#2 2 32.06765
问题的根源在于w\u区域
是长度大于1的向量。不管它对整个组是否具有相同的值,2/c(1,1,1)
是2
您可以将除法移到总和内,如注释和其他答案中所示。这是因为除法分布在一个和中
另一个选项(更一般的选项)是使用返回单个值的w\u area
函数,例如first(w\u area)
或w\u area[1]
。一种安全的方法是使用unique()
,如果只有一个不同的值,它将返回单个元素,但如果同一组中有不同的w\u区域
值,则会抛出此错误,可能会提醒您错误的假设或早期的错误。问题的根源在于w\u area
是长度大于1的向量。不管它对整个组是否具有相同的值,2/c(1,1,1)
是2
您可以将除法移到总和内,如注释和其他答案中所示。这是因为除法分布在一个和中
另一个选项(更一般的选项)是使用返回单个值的w\u area
函数,例如first(w\u area)
或w\u area[1]
。一种安全的方法是使用unique()
,如果只有一个不同的值,它将返回单个元素,但如果同一组中有不同的w\u区域
值,则会抛出此错误,可能会提醒您一个错误的假设或早期的错误。您不能将/w_区域
移动到sum(…)
表达式中吗?您不能将/w_区域
移动到sum(…)
表达式中吗?