当我尝试对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:较长的对象长度不是较短对象长度的倍数 请帮助。
答案 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