как получить информацию из логического входа - PullRequest
0 голосов
/ 19 мая 2019

У меня есть такие данные

df<- structure(list(rowid = 1:12, P = c(TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), T = c(TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE), 
    X = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, 
    FALSE, TRUE, TRUE)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))

Я хочу посмотреть, сколько перекрытий между каждым столбцом, а затем составить диаграмму Венна.Таким образом, я желаю вывод, как это

        overlap      total     
P_vs_T  9            10        
P_vs_X  10           10 
T_vs_X  9            11
T_Vs_P  9            11

Ответы [ 2 ]

2 голосов
/ 19 мая 2019
do.call(rbind, combn(x = names(df)[-1],
                     m = 2,
                     simplify = FALSE,
                     FUN = function(nm)
                         data.frame(overlap = rep(sum(rowSums(df[nm]) == 2), 2),
                                    total = c(sum(df[nm][,1] == 1),
                                              sum(df[nm][,2] == 1)),
                                    row.names = c(paste(nm, collapse = " vs "),
                                                  paste(rev(nm), collapse = " vs ")))))
#       overlap total
#P vs T       9    10
#T vs P       9    11
#P vs X      10    10
#X vs P      10    10
#T vs X       9    11
#X vs T       9    10
1 голос
/ 19 мая 2019

Вот способ с tidyverse -

expand.grid(var1 = names(df)[-1], var2 = names(df)[-1], stringsAsFactors = F) %>% 
  filter(var1 != var2) %>% 
  mutate(
    overlap = apply(., 1, function(x) {
      sum(df[[x[1]]] & df[[x[2]]])
    }),
    total = apply(., 1, function(x) {
      sum(df[[x[1]]])
    })
  ) %>% 
  unite(var1, var2, col = "test", sep = "_vs_")

    test overlap total
1 T_vs_P       9    11
2 X_vs_P      10    10
3 P_vs_T       9    10
4 X_vs_T       9    10
5 P_vs_X      10    10
6 T_vs_X       9    11
...