首页 > 解决方案 > 在 r 中使用 dplyr groupwise 替换列中的多个特定行

问题描述

以下是我的InputDataSet数据集 -

Group   Time    Speed
1       5       25 # Ignore first 3 elements
1       10      23 # Ignore first 3 elements
1       15      21 # Ignore first 3 elements
1       20      33 # Speed - 5 
1       25      40 # Speed - 5
1       30      42 # Speed - 5
1       35      52 # Speed - 5
1       40      48 # Speed - 5
1       45      52 # Speed - 5
2       5       48 # Ignore first 3 elements
2       10      42 # Ignore first 3 elements
2       15      39 # Ignore first 3 elements
2       20      36 # Speed - 5
2       25      38 # Speed - 5
2       30      46 # Speed - 5
2       35      53 # Speed - 5
3       5       45 # Speed - 5
3       10      58 # Speed - 5

在 column 中第三个元素之后的每个组中speed,我想从它的速度值中减去 5 并在该列中替换。如何使用 dplyr 做到这一点?

这是我尝试过的,总是出错,在这里找不到使用replace()函数的方法。

InputDataSet <- InputDataSet %>% group_by(Group) %>% mutate(
  Speed[-c(1:3)] = Speed[-c(1:3)] - 5)

上述方法适用于向量,但是当我尝试dplyr在列中使用它时,它给了我 -

Error: unexpected '=' in:
" 
  Speed[-c(1:3)] ="

标签: rdplyr

解决方案


这是dplyr通过row_numbers的一种方法:

library(dplyr)
df %>%
  group_by(Group) %>%
  mutate(
    r_num = row_number(),
    Speed = ifelse(r_num %in% 1:3, Speed, Speed -5))
# A tibble: 20 x 3
# Groups:   Group [2]
   Group Speed r_num
   <dbl> <dbl> <int>
 1     1  9.44     1
 2     1  9.77     2
 3     1 11.6      3
 4     1  5.07     4
 5     1  5.13     5
 6     1  6.72     6
 7     1  5.46     7
 8     1  3.73     8
 9     1  4.31     9
10     1  4.55    10
11     2 11.2      1
12     2 10.4      2
13     2 10.4      3
14     2  5.11     4
15     2  4.44     5
16     2  6.79     6
17     2  5.50     7
18     2  3.03     8
19     2  5.70     9
20     2  4.53    10

数据:

set.seed(123)
df <- data.frame(
  Group = c(rep(1,10), rep(2,10)),
  Speed = rnorm(20, 10)
)

推荐阅读