Как изменить новый столбец со значениями строк для выбора столбцов в grouped_tbl с помощью dplyr r?

У меня есть сгруппированный фрейм данных из моего большого набора данных с ~ 800 столбцами и ~ 2,5 миллионами записей. Я пытаюсь создать столбцы со средними значениями строки только для 5-10 столбцов в каждом, но, не знаю почему, я продолжаю получать NA как средство для всех строк.

Вот что я пробовал:

clean_bmk <- clean_bmk %>% 
                rowwise() %>%
                mutate(
                       BMK_Mean_Strategic = mean(!!strategic, na.rm = T),
                       BMK_Mean_DiffChange = mean(!!diffchange, na.rm = T),
                       BMK_Mean_Failure = mean(!!failure, na.rm = T),
                       BMK_Mean_Narrow = mean(!!narrow, na.rm = T),
                       BMK_R1_Performance = mean(!!performance_vars, na.rm=T),
                       BMK_R2_Promotion = mean(!!promote_vars, na.rm=T),
                       BMK_R3_Derail = mean(!!derail_vars, na.rm=T))


class(clean_bmk)
[1] "grouped_df" "tbl_df"     "tbl"        "data.frame"

Когда я это делаю, все мутированные столбцы являются NA. Но работает следующее:

clean_bmk$Strategic_Mean <- rowMeans(clean_bmk[,strategic], na.rm=T)

не уверен, почему, и как я могу сделать функцию, чтобы я мог отправлять только список переменных, содержащих имена столбцов, и изменяет столбец в кадре данных?

Например:

strategic <- c("column1", "column15", "column27")

и аналогично с другими переменными, такими как diffchange, failure и т. д.

Я пытался сделать dput(clean_bmk), чтобы поделиться с вами данными, но поскольку набор данных большой, я не смог его получить. Я предполагаю, что из-за того, что это grouped_df, я не мог использовать [[ и sample() набор данных.


person user1828605    schedule 28.02.2020    source источник
comment
Если вы делаете мудрые строки, было бы проще с rowMeans   -  person akrun    schedule 28.02.2020


Ответы (1)


Было бы неэффективно использовать rowwise, вместо этого лучше использовать rowMeans после select обработки интересующих столбцов.

library(dplyr)
clean_bmk %>% 
    ungroup %>%
    mutate(
      BMK_Mean_Strategic = rowMeans(select(., strategic),  na.rm = TRUE),
       BMK_Mean_DiffChange = rowMeans(select(., diffchange), na.rm = TRUE),
       BMK_Mean_Failure = rowMeans(select(., failure), na.rm = TRUE),
       BMK_Mean_Narrow = rowMeans(select(., narrow), na.rm = TRUE),
       BMK_R1_Performance = rowMeans(select(., performance_vars), na.rm=TRUE),
       BMK_R2_Promotion = rowMeans(select(., promote_vars), na.rm=TRUE),
       BMK_R3_Derail = rowMeans(select(., derail_vars), na.rm=TRUE))

Использование воспроизводимого примера

data(mtcars)
#v1 <- c('mpg', 'disp')
mtcars %>%
   transmute(newMean = rowMeans(select(., v1), na.rm = TRUE)) %>%
   head  
#                  newMean
#Mazda RX4           90.50
#Mazda RX4 Wag       90.50
#Datsun 710          65.40
#Hornet 4 Drive     139.70
#Hornet Sportabout  189.35
#Valiant            121.55
person akrun    schedule 28.02.2020
comment
Я пробовал это. Я получаю эту ошибку: Error in rowMeans(select(., strategic), na.rm = T) : 'x' must be numeric - person user1828605; 28.02.2020
comment
@ user1828605 Не могли бы вы проверить, являются ли столбцы числовыми. Я предполагаю, что столбцы являются числовыми. Например. это работает с воспроизводимым примером v1 <- c('mpg', 'disp'); mtcars %>% transmute(newMean = rowMeans(select(., v1), na.rm = TRUE)) %>% head %>% pull(newMean)#[1] 90.50 90.50 65.40 139.70 189.35 121.55 - person akrun; 28.02.2020
comment
Они есть. Это то, что меня сильно смущает, и поэтому я также включил class из df в свой вопрос. Я не уверен, но у меня такое ощущение, что он также добавляет сгруппированный идентификатор, который не является числовым. Итак, всякий раз, когда я пытаюсь запустить rowMeans, как вы показали выше, он также берет идентификатор? и пытаетесь понять? если это так, я не знаю, как это исправить. - person user1828605; 28.02.2020
comment
@user1828605 user1828605, если у вас уже есть атрибут grouped_df, тогда выполните clean_bmk %>% ungroup %>%.. и примените rowMeans, потому что для rowMeans вам не нужен какой-либо групповой атрибут - person akrun; 28.02.2020
comment
@акун. Вот и все!!!! Это было причиной, и функция ungroup() сработала! Удивительно, как быстро вы это придумали!! Огромное спасибо! - person user1828605; 28.02.2020