首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效情况对之间的平均差异

有效情况对之间的平均差异
EN

Stack Overflow用户
提问于 2021-08-31 14:40:09
回答 2查看 68关注 0票数 0

我目前正在处理这样的数据结构:

代码语言:javascript
复制
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)
)
代码语言:javascript
复制
> 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

我需要计算跨var1var2var3的每一对有效案例之间不标准化的平均值差异,对于每一行都是奇异的。

我希望在tibble中得到一个结果变量,其中包含任意两个变量之间的平均差异(在前面列出的3个变量中)。

如果我要用手做第一行的话,我会先计算差额。

2-1=1 1-5= -4 2-5= -3

然后拿模块,因为我只对距离感兴趣。

_~_(_

然后计算出差异的平均值

1+4+3 /3= 2.67

一个重要的例外是,如果安娜或更多人在场,则不应在计数中考虑,也不应在差额或平均数中考虑。在第二排,我需要的结果是6,而不是NA。

2 NAs的预期场景是平均差为0,但NA是可以接受的。

到目前为止,我所尝试的并不成功,因为它并不是一排排的总和:

代码语言:javascript
复制
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中计算它的方法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-31 14:49:21

像这样吗?

代码语言:javascript
复制
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,所以这并不重要。)

票数 2
EN

Stack Overflow用户

发布于 2021-08-31 14:57:31

如果我对你的理解是正确的,你想要的是

代码语言:javascript
复制
df %>%
  mutate(
    meandiff = rowSums(
    cbind(
      abs(var1-var2) / 2,
      abs(var2-var3) / 2,
      abs(var1-var3) / 2
    ), na.rm = TRUE) / 3
  )

顺便说一下,如果您想删除NA并计算平均值,那么/ 3是否仍然是正确的?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69000719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档