Как преобразовать набор столбцов и динамически переименовать их в R? - PullRequest
1 голос
/ 30 апреля 2020

У меня есть фрейм данных ("df"), который содержит ~ 50 столбцов, которые я хотел бы (1) умножить на столбец "weight" (df $ weight), а затем (2) сложить вместе по группам (df $ ГЕОИД). Я хотел бы добавить как столбец с продуктом ("var.prod"), так и столбец с суммой ("var.sum") к моему фрейму данных.

Я выяснил, как это сделать несколько вручную, но я хотел знать, есть ли более быстрое или более элегантное решение. Я новичок в R, поэтому любые отзывы были бы очень полезны - спасибо заранее!

Это то, что я пробовал до сих пор (в этом примере я перечисляю только 6 переменных).

 vlist <- c("gini", "pov", "medinc", "pop", "inc", "pct.unemploy")
 for (v in vlist) {
   df[paste0(v,".prod")] <- df[paste0(v)]*df$weight
 }

 df <- df %>% 
   group_by(GEOID) %>% 
   mutate(gini.sum = sum(gini.prod),
          pov.sum = sum(pov.prod),
          medinc.sum = sum(medinc.prod),
          pop.sum = sum(pop.prod),
          inc.sum = sum(inc.prod),
          pct.unemploy.sum = sum(pct.unemploy.prod))

** Кроме того, я работаю с пространственным фреймом данных, поэтому не могу использовать функции data.table. **

РЕДАКТИРОВАНИЕ ДОБАВИТЬ: Я работаю с ограниченными данными, поэтому, к сожалению, я не могу поделиться своими данными. Но теперь это пример моих данных:

 GEOID    gini   weight
 1        0.31   0.8
 1        0.45   0.2
 2        0.37   1
 3        0.42   1

И это мой предполагаемый вывод:

 GEOID    gini   weight   gini.prod   gini.sum
 1        0.31   0.8      0.248       0.338
 1        0.45   0.2      0.09        0.338
 2        0.37   1        0.37        0.37
 3        0.42   1        0.42        0.42

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Мы можем использовать mutate_at

library(dplyr)
library(stringr)
df <- df %>%
         group_by(GEOID) %>%
          mutate_at(vars(str_c(vlist, ".prod")), 
             list(sum =  ~ sum(., na.rm = TRUE)))

Или используя mutate и across

df <- df %>%
        group_by(GEOID) %>%
        mutate(across(str_c(vlist, ".prod")), list(sum = sum)))
0 голосов
/ 30 апреля 2020

С data.table вы можете сделать:

library(data.table)
setDT(df)

vlist <- c("gini", "pov", "medinc", "pop", "inc", "pct.unemploy")
df[, (lapply(.SD, sum)), by = "GEOID", .SDcols = paste0(vlist, ".prod")]

И если вы хотите указать c имена:

setnames(df, old = c("GEOID", paste0("V", 1:length(vlist)),
             new = c("GEOID", paste0(vlist, ".sum"))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...