Найти максимум строки по столбцам, используя вектор имен столбцов в dplyr - PullRequest
2 голосов
/ 10 апреля 2019

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

Я попробовал приведенный ниже код, но он возвращает одно из имен в списке имен столбцов.

Я также пробовал различные перестановки, используя get (), select () и do.call (), чтобы попытаться заставить R читать символьный вектор по-разному, но я не мог понять это ...

data(mtcars)

colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
  rowwise() %>%
  mutate(max = max(colnames))

РЕДАКТИРОВАТЬ: я хотел бы, чтобы максимум был показан в новом столбце. Например, я хотел бы получить следующий вывод:

vs am gear carb MAX
0  1   4    4    4
0  1   4    4    4
1  1   4    1    4
1  0   3    1    3
0  0   3    2    3

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Вы также можете привести данные в порядок, сначала сделав их длинными, а затем найдя максимум и присоединив его к исходным данным. Обратите внимание, что вам придется использовать gather_() здесь со всеми именами в кавычках, чтобы вы могли ссылаться на свой вектор. В этом примере я использую автомобиль в качестве вашего лекарства и не указывал, есть ли привязка для максимального значения.

library(dplyr)
library(tidyr)
colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
      mutate(nms = row.names(mtcars)) 
#transpose then find max value and keep max value
dfx <-  tidyr::gather_(df, 'nms2','vals', colnames) %>% 
        group_by(nms) %>% 
        mutate(max = max(vals)) %>% 
        ungroup %>% 
        filter(max == vals)
#join back on to data with column name and max value 
mt2 <- left_join(df,select(dfx, nms, vals,nms2),by='nms')

используя pmax и намного меньше кода

вы можете использовать pmax внутри do.call до максимума по ряду

df <- mtcars %>% 
      mutate(mx2 = do.call(pmax,mtcars[,colnames]))
0 голосов
/ 10 апреля 2019

Возможно, это не самый dplyr ответ, но вы всегда можете использовать apply внутри mutate:

mtcars %>%
  mutate(max_val = apply(., 1, function(x) max(x[col_names]))) %>%
  head()

   mpg cyl disp  hp drat    wt  qsec vs am gear carb max_val2 max_val
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4        4       4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4        4       4
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        4       4
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1        3       3
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2        3       3
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1        3       3

Или вы можете сделать что-то вроде этого:

mtcars$max_val2 <- mtcars %>%
  select(col_names) %>%
  transmute(apply(., 1, max)) %>%
  pull()
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb max_val2
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4        4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4        4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        4
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1        3
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2        3
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1        3
0 голосов
/ 10 апреля 2019

Вы можете суммировать выбранное количество столбцов или вектор таких столбцов, как у вас, используя summarise_at из dplyr:

data(mtcars)

colnames <- c("vs", "am", "gear", "carb")

df <- mtcars %>%
  summarise_at(colnames, list(max))

  vs am gear carb
1  1  1    5    8

Сначала вы просто указываете столбцы, а затем функцию; в этом случае max. Это тот же синтаксис для select_at, mutate_at и rename_at - вы используете summarise_at, потому что вы сохраняете указанные столбцы, а не создаете новые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...