R - изменить, если + динамически создать имя столбца - PullRequest
2 голосов
/ 13 мая 2019

Мой df выглядит так:

df <- read.table(text="
   expenses     month     paid_gas   paid_fees  paid_hotel   name
   100          2019-01   20         70         10           Jack Carver
   200          2019-02   40         140        20           Jack Carver
", header=TRUE)

Я бы хотел подсчитать, сколько столбца% расходов создается каждым столбцом с оплаченным префиксом.Другими словами, я хотел бы создать что-то вроде этого:

result <- 
  mutate(
    prc_gas = paid_gas/expenses
)

Но я не хочу делать это вручную для каждого столбца, так как у моего df есть десятки столбцов paid_ + имя вновь созданного столбцадолжен быть всегда текст после префикса.Таким образом, результат должен быть

 result  <- read.table(text="
       expenses     month     paid_gas   paid_fees  paid_hotel   name           prc_gas    prc_fees   prc_hote
       100          2019-01   20         70         10           Jack Carver    20         70         10     
       200          2019-02   40         140        20           Jack Carver    20         70         10     
    ", header=TRUE) 

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Мы можем использовать mutate_at с именованной функцией list для автоматического создания новых столбцов

library (dplyr) # for mutate_at()

df %>% mutate_at(vars(starts_with("paid")), list(prc = ~. / expenses))
#  expenses   month paid_gas paid_fees paid_hotel        name paid_gas_prc
#1      100 2019-01       20        70         10 Jack Carver          0.2
#2      200 2019-02       40       140         20 Jack Carver          0.2
#  paid_fees_prc paid_hotel_prc
#1           0.7            0.1
#2           0.7            0.1

Обратите внимание, что вам не хватает некоторых тиков в данных образца df.


Пример данных

df <- read.table(text="expenses     month     paid_gas   paid_fees  paid_hotel   name
  100          2019-01   20         70         10           'Jack Carver'
  200          2019-02   40         140        20           'Jack Carver'", header=TRUE)
1 голос
/ 13 мая 2019

Мы также можем использовать базу R lapply для расчета для нескольких столбцов

inds <- grep("^paid", names(df), value = TRUE)
df[paste0("perc_", inds)] <- lapply(df[inds], function(x) x/df$expenses)

#  expenses   month paid_gas paid_fees paid_hotel      name        
#1      100 2019-01       20        70         10 Jack Carver           
#2      200 2019-02       40       140         20 Jack Carver                      

#  perc_paid_gas perc_paid_fees perc_paid_hotel
#       0.2            0.7             0.1
#       0.2            0.7            0.1

Или с mapply

df[paste0("perc_", inds)] <- mapply(`/`, df[inds], df["expenses"])
0 голосов
/ 13 мая 2019

Вот вариант с data.table

library(data.table)
nm1 <- startsWith(names(df), "paid")
setDT(df)[, paste0("perc_", names(df)[nm1]) :=
             lapply(.SD, `/`, expenses), .SDcols = nm1]
df
#   expenses   month paid_gas paid_fees paid_hotel        name perc_paid_gas perc_paid_fees perc_paid_hotel
#1:      100 2019-01       20        70         10 Jack Carver           0.2            0.7             0.1
#2:      200 2019-02       40       140         20 Jack Carver           0.2            0.7             0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...