R:如何对另一列中的特定值之间的列进行平均?

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

我有一个潜在的独特问题,我想通过使用

mutate()
中的
dplyr
函数对给定列中的某些值进行平均,但仅限于另一列中包含特定字符串的那些行之间。

例如,我有两个受试者(

Person 1
Person 2
)和他们执行的三种不同类型的测试(
test
列)。
Test 1
Test 2
是相同的测试,但在不同的肢体上进行,因此我想按每个受试者(
name
列)进行分组,并对
error
列中的值进行平均,但仅限于包含
 的行之间Test 1
Test 2
error
Test 3
的值我希望每个主题保持不变。希望这是有道理的,任何帮助将不胜感激。

set.seed(1)
dat <- data.frame(
  name = rep(paste("Person", 1:2), each = 30),
  test = rep(paste("Test", 1:3), each = 10),
  value = round(rnorm(60, 100, 20)),
  error = round(runif(60, 2, 15), 1)
  )

下面是上述数据组的前 3 行。对于输出来说,行数应该是相同的,但是误差值根据以上条件进行聚合。例如,当查看

Person 1
时,第 1 行和第 4 行应该是第 1 行和第 4 行的平均值(第一个
Test 1
观察值),第 2 行 5 应该是第 2 行和第 5 行的平均值,依此类推。
Test 3
保持原样。

# A tibble: 18 × 4
# Groups:   name, test [6]
   name     test   value error
   <chr>    <chr>  <dbl> <dbl>
 1 Person 1 Test 1    87  14.9
 2 Person 1 Test 1   104   8.4
 3 Person 1 Test 1    83   8.3
 4 Person 1 Test 2   130   9.5
 5 Person 1 Test 2   108   3  
 6 Person 1 Test 2    88   2.5
 7 Person 1 Test 3   118  10.9
 8 Person 1 Test 3   116   9.8
 9 Person 1 Test 3   101   5.1
10 Person 2 Test 1   127  10  
11 Person 2 Test 1    98   9.2
12 Person 2 Test 1   108   6.3
13 Person 2 Test 2    97   5.7
14 Person 2 Test 2    95  13.6
15 Person 2 Test 2   114   7.8
16 Person 2 Test 3   108  10.2
17 Person 2 Test 3    88  12.9
18 Person 2 Test 3   107  13.1
r dplyr
1个回答
0
投票

假设您想维护值列,例如保留所有行:

library(dplyr)

dat |>
  mutate(
    error_mean = ifelse(test %in% c("Test 1", "Test 2"),
                        mean(error[test %in% c("Test 1", "Test 2")]),
                        error),
    .by = c(name, test)
  )

#        name   test value error error_mean
# 1  Person 1 Test 1    87  13.9       8.66
# 2  Person 1 Test 1   104   5.8       8.66
# 3  Person 1 Test 1    83   8.0       8.66
# 4  Person 1 Test 1   132   6.3       8.66
# 5  Person 1 Test 1   107  10.5       8.66
# 6  Person 1 Test 1    84   5.4       8.66
# 7  Person 1 Test 1   110   8.2       8.66
# 8  Person 1 Test 1   115  12.0       8.66
# 9  Person 1 Test 1   112   3.1       8.66
# 10 Person 1 Test 1    94  13.4       8.66
# 11 Person 1 Test 2   130   6.4      10.08
# 12 Person 1 Test 2   108  12.9      10.08
# 13 Person 1 Test 2    88   6.5      10.08
# 14 Person 1 Test 2    56   6.3      10.08
# 15 Person 1 Test 2   122   8.2      10.08
# 16 Person 1 Test 2    99  13.6      10.08
# 17 Person 1 Test 2   100  13.2      10.08
# 18 Person 1 Test 2   119   7.1      10.08
# 19 Person 1 Test 2   116  12.1      10.08
# 20 Person 1 Test 2   112  14.5      10.08
# 21 Person 1 Test 3   118   7.7       7.70
# 22 Person 1 Test 3   116  11.3      11.30
# 23 Person 1 Test 3   101   7.2       7.20
# 24 Person 1 Test 3    60   6.2       6.20
# 25 Person 1 Test 3   112  11.8      11.80
# 26 Person 1 Test 3    99   4.6       4.60
# 27 Person 1 Test 3    97  11.2      11.20
# 28 Person 1 Test 3    71   3.6       3.60
# 29 Person 1 Test 3    90   5.2       5.20
# 30 Person 1 Test 3   108   3.9       3.90
# 31 Person 2 Test 1    87  13.9       8.66
# 32 Person 2 Test 1   104   5.8       8.66
# 33 Person 2 Test 1    83   8.0       8.66
# 34 Person 2 Test 1   132   6.3       8.66
# 35 Person 2 Test 1   107  10.5       8.66
# 36 Person 2 Test 1    84   5.4       8.66
# 37 Person 2 Test 1   110   8.2       8.66
# 38 Person 2 Test 1   115  12.0       8.66
# 39 Person 2 Test 1   112   3.1       8.66
# 40 Person 2 Test 1    94  13.4       8.66
# 41 Person 2 Test 2   130   6.4      10.08
# 42 Person 2 Test 2   108  12.9      10.08
# 43 Person 2 Test 2    88   6.5      10.08
# 44 Person 2 Test 2    56   6.3      10.08
# 45 Person 2 Test 2   122   8.2      10.08
# 46 Person 2 Test 2    99  13.6      10.08
# 47 Person 2 Test 2   100  13.2      10.08
# 48 Person 2 Test 2   119   7.1      10.08
# 49 Person 2 Test 2   116  12.1      10.08
# 50 Person 2 Test 2   112  14.5      10.08
# 51 Person 2 Test 3   118   7.7       7.70
# 52 Person 2 Test 3   116  11.3      11.30
# 53 Person 2 Test 3   101   7.2       7.20
# 54 Person 2 Test 3    60   6.2       6.20
# 55 Person 2 Test 3   112  11.8      11.80
# 56 Person 2 Test 3    99   4.6       4.60
# 57 Person 2 Test 3    97  11.2      11.20
# 58 Person 2 Test 3    71   3.6       3.60
# 59 Person 2 Test 3    90   5.2       5.20
# 60 Person 2 Test 3   108   3.9       3.90

请注意,由于示例数据中每次测试的误差值相同,因此每个人的平均值相同。

© www.soinside.com 2019 - 2024. All rights reserved.