在R语言中基于数据框另一列的公式创建新列
解决数据框逐行应用自定义公式的问题
首先注意:你用cbind创建数据框时,会把数值型的dog和cat列转成字符型,这会导致后续计算出错,先修正数据集的创建方式:
# 创建正确的数据集 dog <- c(1,1,1,1,0,2) cat <- c(1,1,0,1,1,4) formula <- c("dog","dog+cat","cat-dog","cat","cat-dog","dog") have <- data.frame(dog, cat, formula, stringsAsFactors = FALSE)
下面提供三种可行的解决方案:
方法一:用dplyr逐行计算
通过rowwise()让mutate逐行处理,确保公式在当前行的变量环境下执行:
library(dplyr) have <- have %>% rowwise() %>% mutate(output = eval(parse(text = formula))) %>% ungroup()
方法二:Base R逐行处理
用apply遍历每一行,把当前行转成列表作为环境传入eval:
have$output <- apply(have, 1, function(row) { eval(parse(text = row["formula"]), envir = as.list(row)) })
方法三:用purrr批量处理
利用pmap_dbl按行传递变量,直接执行公式:
library(purrr) have$output <- pmap_dbl(have, function(dog, cat, formula) { eval(parse(text = formula)) })
执行后就能得到你想要的结果:
dog cat formula output 1 1 1 dog 1 2 1 1 dog+cat 2 3 1 0 cat-dog -1 4 1 1 cat 1 5 0 1 cat-dog 1 6 2 4 dog 2
内容的提问来源于stack exchange,提问作者h09812349
相关产品推荐
相关产品推荐

