R-基于与第二列表混合的条件从列中获得值的总和

时间:2017-12-07 23:34:57

标签: r dplyr

当我尝试对2个列表进行操作时,我收到错误消息并且计算无法正常工作。(请参阅问题末尾)

list2 <- list2 %>% 
mutate(sum_of_part = sum(list1$part[(list1$id < list2$id) & (list1$id >= lag(list2$id))]))

所以我想做的是: 获取list1中所有行的“part”的总和,其中“id”位于list2中当前行的“id”和之前行的“id”之间。 我还想计算用于计算列sum_of_parts的行数。

list1的

  id    Part   ...
  1      2
  2      3
  3      4
  4      6
  99     11
  100     11
  191    11
  222     11
  333    11

list2中

id   ...
 1
 3
 4
 88
 99

溶液

id   ...  sum_of_parts    count
 1   ...        2           1   
 3   ...        9           3
 4   ...        10          2
88   ...        6           1
99   ...        11          1

但是因为我的list2比我的list1小很多,所以我确实得到了这个错误(还有一些但看起来几乎相同): 在list1 $ id&lt; list2 $ id:较长的对象长度不是较短对象长度的倍数 请帮助。

1 个答案:

答案 0 :(得分:0)

你真的很亲密,这个让我一直都是!

mutate按组操作我相信,所以如果你没有指定一个组,它会尝试在向量化操作中使用整个列(通常效率更高),因此关于不同长度的错误

如果要对每一行进行操作,可以使用rowwise()进行以下计算,将每一行视为一组。因此id将是mutate调用中的长度为一的向量。

注意我们需要在分组之前指定滞后,否则使用上面的逻辑,在长度为一的向量中将不存在先前的id

library(dplyr)

list1 <- readr::read_csv(
'id,part
1,2
2,3
3,4
4,6
99,11
100,11
191,11
222,11
333,11')

list2 <- readr::read_csv(
'id
 1
 3
 4
 88
 99'
)

list2 %>% 
  mutate(lag_id = lag(id, default = 0)) %>% 
  rowwise() %>%  
  mutate(sum_of_part = sum(list1$part[(list1$id <= id) & (list1$id > lag_id)]),
         count = length(list1$part[(list1$id <= id) & (list1$id > lag_id)])) %>% 
  select(-lag_id)
#> Source: local data frame [5 x 3]
#> Groups: <by row>
#> 
#> # A tibble: 5 x 3
#>      id sum_of_part count
#>   <int>       <int> <int>
#> 1     1           2     1
#> 2     3           7     2
#> 3     4           6     1
#> 4    88           0     0
#> 5    99          11     1