dplyrlaglead 函数来访问表中的前后 。我正在 中寻找类似的功能。

例如,这里有一个表:

library(tidyverse)
df <- data.frame('score1' = 1:5, 'score2' = 10:6, dif21 = NA_integer_,
                 'score3' = 11:15, 'score4' = 20:16, dif43 = NA_integer_)
#      score1 score2 dif21 score3 score4 dif43
# 1      1     10    NA     11     20    NA
# 2      2      9    NA     12     19    NA
# 3      3      8    NA     13     18    NA
# 4      4      7    NA     14     17    NA
# 5      5      6    NA     15     16    NA


该表具有重复两次的列模式:两列分数,后跟一个空的“dif”列,该列将保存计算值。

我可以使用 mutate_at 对“dif”列进行操作:
df_calc <- df %>%
  mutate_at(
  vars(dif21),
  ~ score2 - score1
  ) %>%
  mutate_at(
    vars(dif43),
    ~ score4 - score3
  )
#     score1 score2 dif21 score3 score4 dif43
# 1      1     10     9     11     20     9
# 2      2      9     7     12     19     7
# 3      3      8     5     13     18     5
# 4      4      7     3     14     17     3
# 5      5      6     1     15     16     1

这让我在“dif”列中获得了我想要的计算分数。一般情况下,公式是从“dif”左侧的第一列位置减去“dif”左侧的第二列位置。这种相对列引用在 Excel 中很容易处理,但我不知道如何在 R 中进行。

实际的应用是一个有很多列的表,所以使用带有相对列引用的单个公式的方法将是一个巨大的效率。

在此先感谢您的帮助!

最佳答案

这是一个 baseR 选项

idx <- which(startsWith(names(df), "dif"))
df[idx] <- df[idx - 1] - df[idx - 2]

结果
df
#  score1 score2 dif21 score3 score4 dif43
#1      1     10     9     11     20     9
#2      2      9     7     12     19     7
#3      3      8     5     13     18     5
#4      4      7     3     14     17     3
#5      5      6     1     15     16     1

这个想法是首先获得以“dif”开头的列的位置。

然后我们简单地从每个“dif”列左侧的第一个位置减去每个“dif”列左侧的第二个位置。

关于R:将包含类似 Excel 的相对引用的函数应用到其他列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56228549/

10-12 17:40