对特定类的变量进行重复操作(简单算术),并使用简洁代码返回新值。
我尝试编写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循环和dplyr
(mutate
/ case_when
)解决方案。
答案 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