сумма строк нескольких переменных - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующая структура для моего набора данных:

id amount zipcode cat1 cat1_times cat2 cat2_times
1  1000   1001      0       0        1      7
2  2000   1001      0       0        1      7
3  2300   1002      1       6        1      5
4  1500   1002      1       6        1      5
5  2700   1003      1       3        1      5
6  3400   1003      1       3        1      5

Cat1 - это двоичная переменная, которая принимает значение 1, если в определенном почтовом индексе есть здание категории 1. Cat1_times - количество зданий категории 1 в определенном почтовом индексе. Я хочу рассчитать общее количество строений (cat1 + cat2) для каждой строки:

id amount zipcode cat1 cat1_times cat2 cat2_times total_times
1  1000   1001      0       0        1      7          7
2  2000   1001      0       0        1      7          7
3  2300   1002      1       6        1      5          11          
4  1500   1002      1       6        1      5          11
5  2700   1003      1       3        1      5          8
6  3400   1003      1       3        1      5          8

Я пытался с суммой (cat1_times, cat2_times), но я получил одинаковый результат для каждой строки.

Ответы [ 4 ]

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

Использование base R

df1$total_times <- Reduce(`+`, df1[grep('cat\\d+_times', names(df1))])
df1$total_times
#[1]  7  7 11 11  8  8
0 голосов
/ 31 августа 2018

Или:

library(dplyr)

df1 %>% select(matches("times")) %>% transmute(total_times=rowSums(.)) %>% bind_cols(df1,.)

#  id amount zipcode cat1 cat1_times cat2 cat2_times total_times
#1  1   1000    1001    0          0    1          7           7
#2  2   2000    1001    0          0    1          7           7
#3  3   2300    1002    1          6    1          5          11
#4  4   1500    1002    1          6    1          5          11
#5  5   2700    1003    1          3    1          5           8
#6  6   3400    1003    1          3    1          5           8
0 голосов
/ 31 августа 2018

В качестве альтернативы, если у вас будет много столбцов

numberOfCategories=2
rowSums(df[,paste0('cat',1:numberOfCategories,'_times')])
0 голосов
/ 31 августа 2018

Использование stringr str_detect с rowSums

library(stringr)
df$Total=rowSums(df[,names(df)[str_detect(names(df),'times')]])
df
  id amount zipcode cat1 cat1_times cat2 cat2_times Total
1  1   1000    1001    0          0    1          7     7
2  2   2000    1001    0          0    1          7     7
3  3   2300    1002    1          6    1          5    11
4  4   1500    1002    1          6    1          5    11
5  5   2700    1003    1          3    1          5     8
6  6   3400    1003    1          3    1          5     8
...