如何解决取 tibble 的对称平均值忽略 NA
我有一个小标题,其中行和列的 ID 相同,我想取平均值(忽略 NA)以使 df 对称。我正在努力了解如何。
data <- tibble(group = LETTERS[1:4],A = c(NA,10,20,NA),B = c(15,NA,25,30),C = c(20,10),D = c(10,12,15,NA)
)
我通常会这样做
A <- as.matrix(data[-1])
(A + t(A))/2
但是由于 NA,这不起作用。
编辑:下面是预期的输出。
output <- tibble(group = LETTERS[1:4],12.5,B = c(12.5,21),12.5),21,NA))
解决方法
这是使用 tidyverse 代码的建议。
library(tidyverse)
data <- tibble(group = LETTERS[1:4],A = c(NA,10,20,NA),B = c(15,NA,25,30),C = c(20,10),D = c(10,12,15,NA)
)
A <- data %>%
pivot_longer(-group,values_to = "x")
B <- t(data) %>%
as.data.frame() %>%
setNames(LETTERS[1:4]) %>%
rownames_to_column("group") %>%
pivot_longer(-group,values_to = "y") %>%
left_join(A,by = c("group","name")) %>%
mutate(
mean = if_else(!(is.na(x) | is.na(y)),(x + y)/2,x),mean = if_else(is.na(mean) & !is.na(y),y,mean)
) %>%
select(-x,-y) %>%
pivot_wider(names_from = name,values_from = mean)
B
## A tibble: 4 x 5
# group A B C D
# <chr> <dbl> <dbl> <dbl> <dbl>
#1 A NA 12.5 20 10
#2 B 12.5 NA 25 21
#3 C 20 25 NA 12.5
#4 D 10 21 12.5 NA
,
好吧,这就是我最终这样做的方式。如果我不使用 for 循环,我会更喜欢,因为我拥有的实际数据要大得多,但乞丐不能选择!
A <- as.matrix(data[-1])
for (i in 1:nrow(A)){
for (j in 1:ncol(A)){
if(is.na(A[i,j])){
A[i,j] <- A[j,i]
}
}
}
output <- (A + t(A))/2
output %>%
as_tibble() %>%
mutate(group = data$group) %>%
select(group,everything())
# A tibble: 4 x 5
group A B C D
<chr> <dbl> <dbl> <dbl> <dbl>
1 A NA 12.5 20 10
2 B 12.5 NA 25 21
3 C 20 25 NA 12.5
4 D 10 21 12.5 NA
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。