Группируйте одну переменную против остальных переменных, объединенных вместе. Перебирайте различные переменные
Допустим, у меня есть данные.кадр, который выглядит так:
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 ответа:
Что-то в этом роде ? (вы можете подмножество из списка)
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