dplyr
有 lag
和 lead
函数来访问表中的前后 行 。我正在 列 中寻找类似的功能。
例如,这里有一个表:
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/