Группируйте одну переменную против остальных переменных, объединенных вместе. Перебирайте различные переменные


Допустим, у меня есть данные.кадр, который выглядит так:

Variable    X     Y     Z
A           2     5     3
B           4     3     2
C           5     1     5
B           6     2     4
C           2     5     2
Используя dplyr или любой другой подходящий пакет, я хотел бы сгруппировать каждую отдельную переменную, сравнить ее с остальными переменными, объединенными вместе, и вычислить математическую операцию между двумя результирующими группами, скажем, сумму по столбцам. Я бы получил что-то вроде этого:
Variable    X     Y     Z
A           2     5     3
rest        17    11    13

Variable    X     Y     Z
B           10    5     6
rest        9     11    10

Variable    X     Y     Z
C           7     6     7
rest        12    10    9

У меня большие данные.фрейм с сотнями переменных, поэтому я также хотел бы сделать это итеративным способом. Какой-нибудь внушение было бы очень кстати. Заранее большое вам спасибо.

2   3  

2 ответа:

Что-то в этом роде ? (вы можете подмножество из списка)

l = lapply(unique(df$Variable), function(x) rbind(colSums(df[df$Variable == x,][c("X", "Y", "Z")]), 
                                                  colSums(df[df$Variable != x,][c("X", "Y", "Z")])))
#[[1]]
#      X  Y  Z
#[1,]  2  5  3
#[2,] 17 11 13

#[[2]]
#      X  Y  Z
#[1,] 10  5  6
#[2,]  9 11 10

#[[3]]
#      X  Y Z
#[1,]  7  6 7
#[2,] 12 10 9

names(l) = LETTERS[1:3]
l = lapply(l, function(x){rownames(x) = c("Variable", "Rest");x})
list2env(l, .Globalenv)  # this should load all dataframes separately

Если вы хотите идти полным tidyverse

library(tidyverse)

df <- tibble(Variable = c("A","B","C","B","C"),
             X = c(2,4,5,6,2),
             Y = c(5,3,1,2,5),
             Z = c(3,2,5,4,2))


group_summary <- function(data, var) {

   data %>%
    group_by_(group = ~ if_else(grepl(var, Variable), var, "rest")) %>%
    summarise_each_(funs(sum),~-Variable) %>% 
    rename_(.dots = setNames(c("group"), c("Variable")))
}

map(unique(df$Variable), ~group_summary(df, .x))


[[1]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     A     2     5     3
2  rest    17    11    13

[[2]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     B    10     5     6
2  rest     9    11    10

[[3]]
# A tibble: 2 × 4
  Variable  X     Y     Z
  <chr> <dbl> <dbl> <dbl>
1     C     7     6     7
2  rest    12    10     9

Если вы хотите получить другой результат, чем список, вы можете изучить использование различных функций отображения (например, map_df) и использование tibbles