Цикл выбора и суммирования каждого столбца для последующей перестановки - PullRequest
1 голос
/ 11 мая 2019

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

df = data.frame(matrix(rnorm(10), nrow=5)) 
category <- rep(c("good", "bad"), c(2, 3))
id <- c(1, 2, 3, 4, 5)
df <- cbind(id, df, category)

  id         X1         X2 category 
1  1  0.5584823 -2.3135133     good     
2  2 -0.1115585  0.4731869     good     
3  3 -0.7435472 -0.0231894      bad      
4  4 -0.6673812  0.7470000      bad      
5  5 -1.2959973  0.4255970      bad      

Так что мне нужно в основном сделать это в циклах:

merged_df %>% filter(category == "bad") %>% select(X1) %>% summarise(mean_X_bad = mean(X1))
merged_df %>% filter(category == "good") %>% select(X2) %>% summarise(mean_X_good = mean(X1))

Как для X1, так и для X2 (и 98 других переменных X, не показанных здесь).

Таким образом, для каждого X от 1 до 100 мне нужно получить среднее значение X в группе = хорошо, а среднее значение X в группе = плохо, чтобы я мог запустить цикл перестановки средних разностей в значении X между группами для всех X.

Я не знаю, как запустить цикл, который выбирает столбец, отображает его в категорию и возвращает среднее значение этого подмножества. Я предполагаю, что для того, чтобы перестановка была выполнена, мне нужен вектор «хороших» средств и «плохих» средств для сравнения. Итак, я думаю, это должно быть результатом первого цикла?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Сначала соберите свои данные (сделайте их "длинными" вместо "широких"), используя tidyr::gather, затем суммируйте, сгруппировав категории и переменные:

library(tidyverse)

df %>%
  gather(key = "variable", value = "value", -id, -category) %>%
  group_by(category, variable) %>%
  summarise(mean = mean(value))

Вот вывод:

# A tibble: 4 x 3
# Groups:   category [2]
  category variable    mean
  <fct>    <chr>      <dbl>
1 bad      X1       -0.323 
2 bad      X2        0.342 
3 good     X1        0.0793
4 good     X2        0.632 
0 голосов
/ 11 мая 2019

Если мы хотим зациклить, используйте map2. Основываясь на коде OP, мы filter используем столбцы 'плохой', 'хороший' и select в 'X1', 'X2'. Итак, передайте их как два vector s в map2, filter, select в наборе данных и summarise mean столбца select ed с новым именем

library(tidyverse)
map2(c("bad", "good"), c("X1", "X2"), ~ 
     df %>% 
       filter(category == .x) %>% 
       select(.y) %>%
       summarise(!! paste0("mean_X_", .x) := mean(!! rlang::sym(.y))))
#[[1]]
#  mean_X_bad
#1 -0.4954794

#[[2]]
#  mean_X_good
#1   0.7497338

Вместо filter в зависимости от категории, он может быть group ed и затем использовать summarise_at

df %>%
   group_by(category) %>%
   summarise_at(vars(matches("^X\\d+$")), mean)
# A tibble: 2 x 3
#  category       X1     X2
#  <fct>       <dbl>  <dbl>
#1 bad       0.228   -0.438
#2 good     -0.00465  0.355

и это дает тот же результат без gather ing (только результаты транспонируются в gather ing)

 df %>%
    gather(key = "variable", value = "value", -id, -category) %>%
    group_by(category, variable) %>%
   summarise(mean = mean(value))
# A tibble: 4 x 3
# Groups:   category [2]
#  category variable     mean
#  <fct>    <chr>       <dbl>
#1 bad      X1        0.228  
#2 bad      X2       -0.438  
#3 good     X1       -0.00465
#4 good     X2        0.355  

данные

set.seed(24)
df = data.frame(matrix(rnorm(10), nrow=5)) 
category <- rep(c("good", "bad"), c(2, 3))
id <- c(1, 2, 3, 4, 5)
df <- cbind(id, df, category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...