повторять повторяющуюся операцию столбцов определенного класса - PullRequest
0 голосов
/ 09 июля 2019

Итерация повторяющейся операции (простая арифметика) над переменными определенного класса и возвращение новых значений с кратким кодом.

Я попытался закодировать цикл for и использовать dplyr case_when для выполнения операции. Операция состоит в том, чтобы разделить числовые столбцы по определенному числовому столбцу и вернуть новые дополнительные столбцы с результатом операций. У меня есть следующие фиктивные данные и код:

 Sp<-   c('ALF-01', 'AMB-01')
 norWT<-    c(4,    74.25)
 stateWT<-  c(4,    74.25)
 avWT<- c(1.1,  3.4)
 t<-data.frame(Sp, norWT, stateWT, avWT)

Я хочу разделить два числовых столбца (norwt, stateWt) на avWT попробовал следующее для loop

output <- vector("double", ncol(t))  
for (i in seq_along(t)) {            
  output[[i]] <-(t, class =='numeric')[[i]]/avWT      
}
output

просто возвращает ошибку

ожидаемый результат должен быть примерно таким:

    Sp1     norWT1  stateWT1 avWT1  norWT_avWT1     stateWT_avWT1
    ALF-01  4.00    4.00    1.1     3.636364        3.636364
    AMB-01  74.25   74.25   3.4     21.838235       21.838235

Было бы здорово увидеть цикл for и решение dplyr (mutate / case_when).

Ответы [ 2 ]

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

Мы можем использовать mutate_at, чтобы разделить определенные столбцы

library(dplyr)

t %>% mutate_at(vars(norWT, stateWT),list(avWT1 = ~./avWT))

#     Sp norWT stateWT avWT norWT_avWT1 stateWT_avWT1
#1 ALF-01  4.00    4.00  1.1    3.636364      3.636364
#2 AMB-01 74.25   74.25  3.4   21.838235     21.838235

Используя базу R, вы можете сделать это напрямую.

cols <- c("norWT", "stateWT")
t[paste0(cols, "_avWT1")] <- t[cols]/t$avWT

Также t - это имя функции в R, поэтому лучше использовать другое имя для dataframe.


Если есть еще много столбцов, и нам нужно использовать это только для числовых столбцов, мы можем использовать mutate_if

t %>%
  mutate_if(is.numeric, list(avWT1 = ~./avWT)) %>%
  select(-avWT_avWT1)
0 голосов
/ 09 июля 2019

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

library(data.table)
nm1 <- c("norWT", "stateWT")
setDT(t)[,  paste0(nm1, "_avWT1") := lapply(.SD, `/`, avWT), .SDcols = nm1]
t
#        Sp norWT stateWT avWT norWT_avWT1 stateWT_avWT1
#1: ALF-01  4.00    4.00  1.1    3.636364      3.636364
#2: AMB-01 74.25   74.25  3.4   21.838235     21.838235
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...