不知何故,当我尝试对组中的前几行求和时,
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 动词中使用括号子集
[
。在这种情况下,您可以通过使用 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