我有下表提供了样本数据:
set.seed(10)
dat <- data.frame(grp1 = sample(c(0, 1), size = 5, replace = TRUE),
grp2 = sample(c(0, 1), size = 5, replace = TRUE),
grp3 = sample(c(0, 1), size = 5, replace = TRUE),
value = round(runif(5, min = 0, max = 10), 0) )
dat
grp1 grp2 grp3 value
1 0 0 0 4
2 0 1 1 1
3 1 1 0 3
4 1 0 0 4
5 1 0 1 8
但最后,我需要一条这样的老虎:
group mean
-----------------------
grp1 5.0
grp2 2.0
grp3 4.5
通常,我会做一个pivot_longer(cols = starts_with("grp"))
,这样我就可以轻松地group_by(name)
和计算groupwise意味着使用summarise(mean = mean(value, na.rm=TRUE))
。但在这里,我的问题是,这5个元素中的每个元素都可以属于多个组(grp1、grp2、grp3),因此组之间存在一些重叠。我天真的尝试是分别计算每个组的均值,然后再对它们进行rbind()
。但是随着组数的增加,这变得很烦人,所以我正在寻找一种方法来实现这个自动化。
发布于 2022-05-18 00:37:43
一个想法可以是,
library(dplyr)
library(tidyr)
dat %>%
pivot_longer(grp1:grp3, names_repair = 'unique') %>%
filter(value...3 == 1) %>%
group_by(name) %>%
summarise(means = mean(value...1))
New names:
* value -> value...1
* value -> value...3
# A tibble: 3 x 2
name means
<chr> <dbl>
1 grp1 5
2 grp2 2
3 grp3 4.5
发布于 2022-05-18 00:39:23
这里有一个选择。该解决方案主要基于based。最后,我只使用dplyr
创建了一个dplyr
。
library(dplyr)
dat2 <- dat[, -ncol(dat)] * dat[, ncol(dat)]
dat3 <- sapply(dat2, function(x) mean(x[x != 0]))
dat4 <- tibble(
group = names(dat3),
mean = dat3
)
dat4
# # A tibble: 3 x 2
# group mean
# <chr> <dbl>
# 1 grp1 5
# 2 grp2 2
# 3 grp3 4.5
发布于 2022-05-18 00:53:33
colSums(dat$value * dat[-ncol(dat)]) / colSums(dat[-ncol(dat)])
data.frame(grp = names(d), mean = unname(d))
# grp mean
#1 grp1 5.0
#2 grp2 2.0
#3 grp3 4.5
https://stackoverflow.com/questions/72285652
复制