【发布时间】:2020-12-17 17:10:18
【问题描述】:
我正在尝试修改包含两列的数据框,以添加第三个,根据其他列的内容(即每个列的内容是正数还是负数)返回四个可能的表达式。
我尝试了几种方法,dplyr 和 sapply 中的 'mutate' 函数。不幸的是,当我收到错误“条件的长度> 1并且只使用第一个元素”时,我似乎遗漏了一些东西。因此,只有第一次迭代会应用于新列中的每一行。
一个可重现的例子(我尝试过的变异方法)如下:
Costs <- c(2, -5, -7, 3, 12)
Outcomes <- c(-2, 5, -7, 3, -2)
results <- as.data.frame(cbind(Costs, Outcomes))
results
quadrant <- function(cost,outcome) {
if (costs < 0 &
outcomes < 0) {
"SW Quadrant"
}
else if (costs<0 & outcomes>0){
"Dominant"
}
else if (costs>0 & outcomes<0){
"Dominated"
}
else{""}
}
results <- mutate(results,Quadrant = quadrant(Costs,Outcomes)
)
完整的警告信息是:
警告信息: 1:
mutate()输入问题Quadrant。 i 条件的长度 > 1 并且仅使用第一个元素 i 输入Quadrant是quadrant(results$Costs, results$Outcomes)。 2:如果(成本 1 并且只使用第一个元素 3:mutate()输入Quadrant有问题。 i 条件的长度 > 1 并且仅使用第一个元素 i 输入Quadrant是quadrant(results$Costs, results$Outcomes)。 4:如果(成本 0){ : 条件的长度 > 1 并且只使用第一个元素 5:mutate()输入Quadrant有问题。 i 条件的长度 > 1 并且仅使用第一个元素 i 输入Quadrant是quadrant(results$Costs, results$Outcomes)。 6: 如果 (成本 > 0 & 结果 1 并且只使用第一个元素
我对 sapply 函数的尝试:
results <- sapply(results$Quadrant,quadrant(results$Costs,results$Outcomes))
导致以下错误,并与 mutate 方法一致的警告消息。
get(as.character(FUN), mode = "function", envir = envir) 中的错误: 找不到模式“功能”的对象“支配”
我确定我在这里遗漏了一些明显的东西。感谢您的任何建议。
【问题讨论】:
-
我在下面添加了一个答案,但我认为主要问题是
if()没有矢量化,因此评估发生在第一个元素上,而不是像ifelse()函数那样逐元素。
标签: r if-statement dplyr sapply