我编写了一个自定义函数,该函数对一列数据执行数学转换,输入为数据,另一个为输入(温度)。我想进行2种不同的逻辑检查。第一个是该列中的任何值是否超过某个阈值,因为在阈值之上和之下的转换都不同。第二步是检查温度输入是否高于某个特定值,在这种情况下,发出警告,指出高于阈值的值不正常并检查数据。
现在,我已经用一系列if / else语句编写了函数。但是,这警告它仅使用T / F语句字符串的第一个元素。我的函数的简化示例如下:
myfun = function(temp,data) {
if(temp > 34){
warning('Temperature higher than expected')
}
if (data > 50) {
result = temp*data
return(result)
} else if(data <= 50) {
result = temp/data
return(result)
}
}
myfun(temp = c(25,45,23,19,10), data = c(30,40,NA,50,10))
如您所见,由于仅在if / else语句中使用第一个值,因此它无法正确计算返回值,因为它不会在转换的两个版本之间进行切换。此外,它仅检查第一个温度值是否高于阈值。我如何才能将其正确地应用于每个值而不只是第一个值的逻辑检查?
-根据@The_Questioner的建议简化了功能,并将<50更改为<= 50。
答案 0 :(得分:2)
代码的主要问题是将所有值作为向量传递给函数,但随后进行单个元素比较。您需要将元素一一传递给函数,或者将某种矢量化比较或for循环放入函数中。下面是 for循环方法,这可能是执行此操作的最简单的方法,但至少很容易理解发生了什么。
另一个问题是,在传递给任何条件语句之前,显然需要在 data 向量中处理NA。否则会出现错误。
最后一个问题是数据 = 50时的处理方式。现在,您有条件测试的条件是大于或小于50,但是您可以看到,数据中的第4点< / strong>是50,所以现在您得到NA。
myfun = function(temp,data) {
result <- rep(NA,length(temp))
for (t in 1:length(temp)) {
if(temp[t] > 34) {
warning('Temperature higher than expected')
if (!is.na(data[t])) {
if (data [t] > 50) {
result[t] <- temp[t]*data[t]
} else if(data[t] < 50) {
result[t] <- temp[t]/data[t]
}
}
} else {
if (!is.na(data[t])) {
if (data[t] > 50) {
result[t] <- temp[t]*data[t]
} else if(data[t] < 50) {
result[t] <- temp[t]/data[t]
}
}
}
}
return(result)
}
输出:
> myfun(temp = c(25,45,23,19,10), data = c(30,40,NA,50,10))
[1] 0.8333333 1.1250000 NA NA 1.0000000