r-如何在包含因子的数据帧中获得所有列组合之间的%相等



这是一个玩具数据集。

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 

使用dplyr1.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)))

最新更新