Нужны акции определенного уровня от Партнера - PullRequest
1 голос
/ 21 июня 2019

Мой фрейм данных имеет 3 столбца, первый содержит имена разных партнеров, а второй содержит разные уровни (у всех партнеров есть все уровни). Третий столбец содержит объем этого конкретного уровня с этим партнером. Похоже, это

Partner | Level | Volume  
a       | 32    | 213  
b       | 32    | 450  
c       | 24    | 56
a       | 24    | 213

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

for (i in 1:nrow(df) {
  for (a in partners) {
    if (df$Partner[i] == a) {
      df$Share[i] <- df$Volume[i] / filter(aggregate(.~Partner, df, sum), Partner %in% i)$Volume
      break
    }
  }
}

Нет ошибки, но фрейм данных остается неизменным. Что я делаю не так, и есть ли другой способ сделать это лучше? Потому что я буду выполнять это на очень большом наборе данных

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Довольно простым решением для базы R было бы вычислить таблицу частот, равную Partner, разделить 1 на каждую частоту, а затем объединить ее с исходным кадром данных

Share <- as.data.frame(1/table(df$Partner))
names(Share) <- c("Partner", "Share")
df <- merge(df, Share, by = "Partner")

#### OUTPUT ####

  Partner Level Volume Share
1       a    32    213   0.5
2       a    24    213   0.5
3       b    32    450   1.0
4       c    24     56   1.0

Другое, более чистое решение может бытьиспользовать dplyr:

library(dplyr)

df %>% 
    group_by(Partner) %>% 
    mutate(Share = 1/n())

#### OUTPUT ####

# A tibble: 4 x 4
# Groups:   Partner [3]
  Partner Level Volume Share
  <chr>   <int>  <int> <dbl>
1 a          32    213   0.5
2 b          32    450   1  
3 c          24     56   1  
4 a          24    213   0.5
0 голосов
/ 21 июня 2019

Вот решение в базе R:

df <- data.frame(Partner = c("a", "b", "c", "a"), Level = c(32, 32, 24, 23), Volume = c(213, 450, 56, 213))

df$Share <- sapply(1:nrow(df), function(k) df$Volume[k] / sum(df$Volume[df$Partner[k] == df$Partner]))*100
df

  Partner Level Volume Share
1       a    32    213    50
2       b    32    450   100
3       c    24     56   100
4       a    23    213    50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...