我目前正在处理这样的数据结构:
library(tibble)
df <- tibble(
id = c("1", "2", "3", "4", "5"),
var1 = c(2, NA, 3, 1, 2),
var2 = c(1, 2, NA, NA, 2),
var3 = c(5, 8, 6, NA, NA),
var4 = c(11, 22, 33, 44, 55)
)> df
# A tibble: 5 × 5
eid var1 var2 var3 var4
<chr> <dbl> <dbl> <dbl> <dbl>
1 1 2 1 5 11
2 2 NA 2 8 22
3 3 3 NA 6 33
4 4 1 NA NA 44
5 5 2 2 NA 55我需要计算跨var1、var2和var3的每一对有效案例之间不标准化的平均值差异,对于每一行都是奇异的。
我希望在tibble中得到一个结果变量,其中包含任意两个变量之间的平均差异(在前面列出的3个变量中)。
如果我要用手做第一行的话,我会先计算差额。
2-1=1 1-5= -4 2-5= -3
然后拿模块,因为我只对距离感兴趣。
_~_(_
然后计算出差异的平均值
1+4+3 /3= 2.67
一个重要的例外是,如果安娜或更多人在场,则不应在计数中考虑,也不应在差额或平均数中考虑。在第二排,我需要的结果是6,而不是NA。
2 NAs的预期场景是平均差为0,但NA是可以接受的。
到目前为止,我所尝试的并不成功,因为它并不是一排排的总和:
df %>%
mutate(meandiff = sum(
abs(sum(var1, -var2, na.rm = TRUE)),
abs(sum(var2, -var3, na.rm = TRUE)),
abs(sum(var1, -var3, na.rm = TRUE)),
na.rm = TRUE
) / 3)我正在考虑使用函数rowsum(),但是我需要两两的区别,而不是对所有三个变量都是一样的。
你能帮我找到一种在R中计算它的方法吗?
谢谢!
发布于 2021-08-31 14:49:21
像这样吗?
func <- function(...) {
dots <- na.omit(c(...))
sum(abs(diff(c(dots, dots[1]))), na.rm = TRUE) / length(dots)
}
df %>%
mutate(meandiff = mapply(func, var1, var2, var3))
# # A tibble: 5 x 6
# id var1 var2 var3 var4 meandiff
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 2 1 5 11 2.67
# 2 2 NA 2 8 22 6
# 3 3 3 NA 6 33 3
# 4 4 1 NA NA 44 0
# 5 5 2 2 NA 55 0 (这将计算var3 - var1的第三个中期sum值,而不是var1 - var3,但是由于使用了abs,所以这并不重要。)
发布于 2021-08-31 14:57:31
如果我对你的理解是正确的,你想要的是
df %>%
mutate(
meandiff = rowSums(
cbind(
abs(var1-var2) / 2,
abs(var2-var3) / 2,
abs(var1-var3) / 2
), na.rm = TRUE) / 3
)顺便说一下,如果您想删除NA并计算平均值,那么/ 3是否仍然是正确的?
https://stackoverflow.com/questions/69000719
复制相似问题