使用 dplyr 计算数据框中行的子集总和

问题描述 投票:0回答:1

不知何故,当我尝试对组中的前几行求和时,

dplyr
出现错误。

我尝试在

dplyr
之外重建问题,它工作正常,没有错误。谁能建议我做错了什么?

我有一个数据框,其中包含字符串内的开始位置和结束位置。我匹配不同长度的图案(

nchar
)。对于每一行,我想找到原始文本中的位置(模式之前的 1),而不需要前一个模式长度的长度...所以第一个模式从 3 开始(
4-1
),第二个模式从 9 开始(
21-1-11
) ),第三名是 28 (
50-1-sum(11,10)
)

library(dplyr)
df <- data.frame(
  id=1,
  start=c(4, 21, 50),
  end=c(14, 30, 60),
  nchar=c(11,10,11)
) 
df %>% 
  group_by(id) %>% 
  mutate(pos=start[row_number()] -
           (1 + sum(nchar[0:(row_number() - 1)])))

产品

# A tibble: 3 x 5
# Groups:   id [1]
     id start   end nchar   pos
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     4    14    11     3
2     1    21    30    10    20
3     1    50    60    11    49
Warning message:
There was 1 warning in `mutate()`.
i In argument: `pos = start[row_number()] - (1 + sum(nchar[0:(row_number() - 1)]))`.
i In group 1: `id = 1`.
Caused by warning in `0:(row_number() - 1)`:
! numerical expression has 3 elements: only the first used 

我对新专栏的期望是什么

sapply(1:3, function(i) df$start[i] - (1 + sum(df$nchar[0:(i - 1)])))

这给出了正确的位置...

dplyr
1个回答
0
投票

一般来说,您应该避免在 dplyr 动词中使用括号子集

[
。在这种情况下,您可以通过使用
cumsum()
迭代求和并使用
lag()
访问上一行来获得所需的输出:

df %>% 
  group_by(id) %>% 
  mutate(pos = start - 1 - cumsum(lag(nchar, default = 0)))

为您提供所需的输出:

# Groups:   id [1]
     id start   end nchar   pos
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     4    14    11     3
2     1    21    30    10     9
3     1    50    60    11    28
© www.soinside.com 2019 - 2024. All rights reserved.