r-dplyr:返回多个值的组的加权和错误

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

在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个流域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(…)
表达式中吗?