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

时间:2017-01-11 17:51:57

标签: 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.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的%林覆盖?

2 个答案:

答案 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,则会抛出此错误同一组中的值,可能会提醒您错误的假设或早期的错误。