这是一个玩具数据集。
data = crossing(q = letters[1:4], nums = c(1:100))
set.seed(25)
data$val = sample(as.factor(c("x","y", "z")), nrow(data), prob = c(0.5,0.2,0.3), replace = T)
data = data %>% pivot_wider(names_from = q, values_from = val) %>% select(-nums)
a b c d
<fct> <fct> <fct> <fct>
1 x z x x
2 z x x y
3 x z x y
4 y x x y
5 x x x x
6 y z y z
7 z x x x
8 x z x z
9 x y z y
10 x z x y
如何以这种方式获得所有列组合的平均值将有6种组合,但如果要比较的列超过5列,最明智的方法是什么。
data %>%
summarise(mean(a == b),
mean(a == c),
mean(a == d)
)
# A tibble: 1 x 3
`mean(a == b)` `mean(a == c)` `mean(a == d)`
<dbl> <dbl> <dbl>
1 0.4 0.41 0.39
你可以做:
library(purrr)
cmbs <- combn(names(data), 2, FUN = list)
names(cmbs) <- map_chr(cmbs, paste, collapse = "_")
map_dbl(cmbs, ~ mean(exec(`==`, !!!data[.x])))
a_b a_c a_d b_c b_d c_d
0.40 0.41 0.39 0.40 0.41 0.46
使用dplyr
1.0.0版本,
data %>% summarise(across(b:d, ~mean(.x == a)))
给出
# A tibble: 1 x 3
b c d
<dbl> <dbl> <dbl>
1 0.4 0.41 0.39
但我不知道你说的";5列":我只看到4个。所以我可能误解了你的意思。
你可以通过位置和名称来识别列,这样你就可以更容易地概括:
data %>% summarise(across(2:4, ~mean(.x == a)))