Сложить один столбец на основе значений другого столбца - PullRequest
0 голосов
/ 07 июня 2018

У меня есть фрейм данных, такой как ниже.

df <- data.frame(mnth = c("jan", "feb", "feb", "mar", "mar",
                          "mar", "apr", "apr", "apr", "apr", 
                          "may", "may", "may", "may", "may"),
                 n = c(1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5),
                 value = c(5, 1, 3, 2, 8, 0, 6, 0, 2, 7, 2, 1, 4, 2, 6))

Я хочу добавить соответствующий номер в поле value для каждого значения поля n.

В этом случае ответ должен быть:
16, 12, 6, 9, 6

16 = 5 + 1 + 2 + 6 + 2  # all rows where 'n' = 1
12 = 3 + 8 + 0 + 1      # all rows where 'n' = 2
6  = 0 + 2 + 4          # all rows where 'n' = 3
9  = 7 + 2              # all rows where 'n' = 4
6                       # all rows where 'n' = 5

Как мне написать цикл for для добавления чисел в R?

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Я согласен с Sab по поводу использования data.table.Я думаю, что в вашем ожидаемом выводе могла быть опечатка, поэтому я включил в свой пример несколько различных опций:

library(data.table)

df <- data.frame(mnth = c("jan", "feb", "feb", "mar", "mar",
                      "mar", "apr", "apr", "apr", "apr", 
                      "may", "may", "may", "may", "may"),
             n = c(1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5),
             value = c(5, 1, 3, 2, 8, 0, 6, 0, 2, 7, 2, 1, 4, 2, 6))

setDT(df)  # converts data.frame to data.table

df[,.(sum_n = sum(n),  # adds up the 'n' column
  sum_value = sum(value),  # adds up the 'value' column
  count_row = .N), by=mnth]  # counts the number of rows for each value of 'mnth'

Это дает следующие результаты:

   mnth sum_n sum_value count_row
1:  jan     1         5         1
2:  feb     3         4         2
3:  mar     6        10         3
4:  apr    10        15         4
5:  may    15        15         5

РЕДАКТИРОВАТЬ:

После разъяснения автора, вот рабочий код:

df[,.(sum_value = sum(value)), by = .(n)]

Это дает следующие результаты:

> df[,.(sum_value = sum(value)), by = .(n)]
   n sum_value
1: 1        16
2: 2        12
3: 3         6
4: 4         9
5: 5         6
0 голосов
/ 07 июня 2018

Вот решение с использованием data.table и merge - действительно просто:

library(data.table)
dt1 <- as.data.table(df)

dt2 <- dt2 <- data.table(mnth = c('jan', 'feb', 'mar', 'apr', 'may'), 
                         N = c(16, 12, 6, 9, 6))

> merge(dt, dt2, by = 'mnth', all = T, fill = T)
    mnth n value  N
 1:  apr 1     6  9
 2:  apr 2     0  9
 3:  apr 3     2  9
 4:  apr 4     7  9
 5:  feb 1     1 12
 6:  feb 2     3 12
 7:  jan 1     5 16
 8:  mar 1     2  6
 9:  mar 2     8  6
10:  mar 3     0  6
11:  may 1     2  6
12:  may 2     1  6
13:  may 3     4  6
14:  may 4     2  6
15:  may 5     6  6

Если вы хотите только подсчет наблюдений и суммы столбцов, вы можете использовать аргумент by в data.table:

> dt[, .(nsum = sum(n), valsum = sum(value), obs = .N), by = mnth]
   mnth nsum valsum obs
1:  jan    1      5   1
2:  feb    3      4   2
3:  mar    6     10   3
4:  apr   10     15   4
5:  may   15     15   5
0 голосов
/ 07 июня 2018

Я бы не использовал цикл for для этого, потому что это можно сделать с помощью однострочного (возможно, немного загадочного, но все же):

df$N <- c(16, 12, 6, 9, 6)[df$mth]

Перед этим вам нужнопереупорядочить коэффициент mth осторожно:

df$mth <- factor(df$mth, levels=c("jan", "feb", "mar", "apr", "may"))

Результат:

> df
   mth n value N
1  jan 1     5 16
2  feb 1     1 12
3  feb 2     3 12
4  mar 1     2  6
5  mar 2     8  6
6  mar 3     0  6
7  apr 1     6  9
8  apr 2     0  9
9  apr 3     2  9
10 apr 4     7  9
11 may 1     2  6
12 may 2     1  6
13 may 3     4  6
14 may 4     2  6
15 may 5     6  6

Эквивалент с циклом for может быть:

for (i in 1:nrow(df)) {
  df$N[i] <- switch(as.character(df$mth[i]), 
                    "apr" = 9,
                    "feb" = 12,
                    "jan" = 16,
                    "mar" = 6,
                    "may" = 6)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...