сумма для каждого идентификатора в зависимости от другой переменной - PullRequest
0 голосов
/ 04 июля 2019

Я хотел бы суммировать столбец (по идентификатору) в зависимости от другой переменной (группы).Если мы возьмем, например:

ID      t        group   
 1      12         1
 1      14         1
 1      2          6
 2      0.5        7
 2      12         1
 3      3          1
 4      2          4

Я бы хотел суммировать значения столбца t отдельно для каждого идентификатора, только если группа == 1, и получить:

ID      t        group     sum
 1      12         1        26
 1      14         1        26
 1      2          6        NA
 2      0.5        7        NA
 2      12         1        12
 3      3          1         3
 4      2          4        NA

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

Использование dplyr,

df %>% 
 group_by(ID) %>% 
 mutate(new = sum(t[group == 1]), 
        new = replace(new, group != 1, NA))

что дает,

# A tibble: 7 x 4
# Groups:   ID [4]
     ID     t group   new
  <int> <dbl> <int> <dbl>
1     1  12       1    26
2     1  14       1    26
3     1   2       6    NA
4     2   0.5     7    NA
5     2  12       1    12
6     3   3       1     3
7     4   2       4    NA
1 голос
/ 04 июля 2019

Рассмотрим базу R с ifelse и ave() для условной агрегированной агрегации.

df$sum <- with(df, ifelse(group == 1, ave(t, ID, group, FUN=sum), NA))

df

#   ID    t group sum
# 1  1 12.0     1  26
# 2  1 14.0     1  26
# 3  1  2.0     6  NA
# 4  2  0.5     7  NA
# 5  2 12.0     1  12
# 6  3  3.0     1   3
# 7  4  2.0     4  NA

Rextester demo

0 голосов
/ 04 июля 2019

Мы можем использовать data.table методы. Преобразуйте файл «data.frame» в «data.table» (setDT(df)), сгруппированный по «ID», укажите i с логическим выражением group ==1, получите sum из «t» и назначьте ( :=) это «новое». По умолчанию другим строкам присваивается значение NA, по умолчанию

library(data.table)
setDT(df)[group == 1,  new := sum(t), ID]
df
#   ID    t group new
#1:  1 12.0     1  26
#2:  1 14.0     1  26
#3:  1  2.0     6  NA
#4:  2  0.5     7  NA
#5:  2 12.0     1  12
#6:  3  3.0     1   3
#7:  4  2.0     4  NA

Данные

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 4L), t = c(12, 
14, 2, 0.5, 12, 3, 2), group = c(1L, 1L, 6L, 7L, 1L, 1L, 4L)),
class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...