重复某些类的列的重复操作

时间:2019-07-09 00:03:44

标签: r dplyr

对特定类的变量进行重复操作(简单算术),并使用简洁代码返回新值。

我尝试编写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)

我想用avWT除以两个数字列(norwt,stateWt) 尝试了以下for循环

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循环和dplyrmutate / case_when)解决方案。

2 个答案:

答案 0 :(得分:2)

我们可以使用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中函数的名称,因此最好为数据帧使用其他名称。


如果还有更多列,而我们只需要对数字列进行操作,则可以使用mutate_if

t %>%
  mutate_if(is.numeric, list(avWT1 = ~./avWT)) %>%
  select(-avWT_avWT1)

答案 1 :(得分:0)

有了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