R语言 通过仅取组中与另一列上的选定行相等的行的平均值,在组中进行变化

wztqucjr  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(125)

我遇到了一个问题,我正在按一个变量(组)对数据集进行分组,并希望创建一个新的输出列,该列是每个组内值列的平均值,并且添加了一个条件,即我们只希望在计算平均值时考虑给定行的值的1以内的值。
因此,如果同一行中的三行具有day={1,2,3},则第一行和第三行将仅具有包括其自身和第二行的均值,但第二行的均值包括所有三个值。
本质上,我想知道如何访问SPECIFIC ROW的day值,然后使用它来获取一组day值接近该数字的行的子集。
所以如果输入是

df <- read.table(text = "
index    group  day     value
1        A      1       10
2        A      2       20
3        A      3       30
4        B      2       20
5        B      3       30
6        B      5       50", header = TRUE)

输出应如下所示

index    group  day     value  output
1        A      1       10      15
2        A      2       20      20
3        A      3       30      25
4        B      2       20      25
5        B      3       30      25
6        B      5       50      50

我已经尝试过按组和日期分组,但是在平均值中包含给定行的day=+-1的行似乎计算量太大,无法运行我正在使用的大型数据集。

zxlwwiss

zxlwwiss1#

df %>%
  group_by(group) %>%
  mutate(output = slider::slide_index_dbl(value, day, mean, .before = 1, .after = 1)) %>%
  ungroup()

或者使用dplyr v1.1.0+,跳过group_by/ungroup,而是在mutate行中添加.by = group
结果

# A tibble: 6 × 5
  index group   day value output
  <int> <chr> <int> <int>  <dbl>
1     1 A         1    10     15
2     2 A         2    20     20
3     3 A         3    30     25
4     4 B         2    20     25
5     5 B         3    30     25
6     6 B         5    50     50
wlwcrazw

wlwcrazw2#

这是一个基本的R解

df$output <- unlist(lapply(split(df, df$group), \(i) 
               sapply(i$day, \(j) 
                      mean(i$value[i$day %in% (j-1):(j+1)]))))

#  index group day value output
#1     1     A   1    10     15
#2     2     A   2    20     20
#3     3     A   3    30     25
#4     4     B   2    20     25
#5     5     B   3    30     25
#6     6     B   5    50     50

相关问题