быстрое суммирование нескольких столбцов в фрейме R - PullRequest
0 голосов
/ 29 августа 2018

У меня есть фрейм данных, такой как mtcars, и строковый вектор имен столбцов, например, c("mpg", "cyl", "disp", "hp", "drat"), и я хотел бы объединить все столбцы в новый.

я бы обычно использовал что-то вроде

mtcars %>% transmute(new_col = mpg + cyl + disp + hp + drat)

   new_col
1   300.90
2   300.90
3   231.65
4   398.48
5   564.85
6   356.86
7   630.51

Однако это становится очень утомительным, если у вас есть сотни имен столбцов, сохраненных в векторе.

Итак, мой вопрос: есть ли способ суммировать множество столбцов, где имена столбцов содержатся в векторе строк?

Ответы [ 5 ]

0 голосов
/ 29 августа 2018

Применяется базовая функция

mtcars$NewCol <- as.numeric(apply(mtcars[,1:5], 1, sum))
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb NewCol
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 300.90
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 300.90
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 231.65
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 398.48
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 564.85
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 356.86
0 голосов
/ 29 августа 2018

Сочетание двух подходов:

mtcars %>% select(cols) %>% transmute(x=rowSums(.))
0 голосов
/ 29 августа 2018

Хорошее предложение от RSK

Вы также можете использовать apply

cols <- c('mpg','cyl','disp','hp','drat')
mtcars$new_col <- apply(mtcars[,cols],1,sum)
0 голосов
/ 29 августа 2018

Вот альтернативный подход с использованием tidyverse:

library(tidyverse)

# input columns of interest
cols = c("mpg", "cyl", "disp", "hp", "drat")

mtcars %>% 
  group_by(id = row_number()) %>%  # for each row
  nest(cols) %>%                   # nest selected columns
  mutate(SUM = map_dbl(data, sum)) # calculate the sum of those columns

# # A tibble: 32 x 3
#      id data               SUM
#   <int> <list>           <dbl>
# 1     1 <tibble [1 x 5]>  301.
# 2     2 <tibble [1 x 5]>  301.
# 3     3 <tibble [1 x 5]>  232.
# 4     4 <tibble [1 x 5]>  398.
# 5     5 <tibble [1 x 5]>  565.
# 6     6 <tibble [1 x 5]>  357.
# 7     7 <tibble [1 x 5]>  631.
# 8     8 <tibble [1 x 5]>  241.
# 9     9 <tibble [1 x 5]>  267.
# 10    10 <tibble [1 x 5]>  320.
# # ... with 22 more rows

Выходные данные - это фрейм данных, содержащий идентификатор строки (id), данные, используемые в каждой строке (data), и вычисленную сумму (SUM).

Вы можете получить вектор рассчитанного SUM, если вы добавите ... %>% pull(SUM).

0 голосов
/ 29 августа 2018

Используйте функцию rowSums.

colnms=c("mpg", "cyl", "disp", "hp", "drat")
mtcars$new_col<-rowSums(mtcars[,colnms])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...