我想循环通过一个数据框,并创建一个新列,如果行中的第二个到第四个元素是“ANOMALY”,则表示“YES”,否则表示“NO”。
for (j in 1:nrow(residual_anomalies)){
if (all(residual_anomalies[j,2:4]=='ANOMALY')) {residual_anomalies$Prediction_Anomaly[j] <- 'YES'} else
residual_anomalies$Prediction_Anomaly[j] <- 'NO'
}所以上面就是我目前使用的。它可以工作,但它的计算性能受到了很大的影响,所以我试图将其矢量化。到目前为止,我所做的是创建一个函数,该函数根据行的元素是否都是“ANOMALY”来返回“YES”或“NO”。
vote_for_anomaly <- function(x){
if (all(x)=='ANOMALY') return('YES') else
return('NO')}然后我尝试使用R中的apply函数
aggregates <- apply(residual_anomalies[,2:4],1,vote_for_anomaly)但是,我得到了以下错误/警告
Error in if (all(x) == "ANOMALY") return("ANOMALY") else return("NO SIGNAL") :
missing value where TRUE/FALSE needed
In addition: Warning message:
In all(x) : coercing argument of type 'character' to logical谁能告诉我为什么这不起作用,我应该如何改变这一点?
您可以使用此数据进行测试,并将其命名为residual_anomalies
1 ANOMALY ANOMALY ANOMALY ANOMALY
2 ANOMALY NO SIGNAL ANOMALY ANOMALY
3 ANOMALY ANOMALY ANOMALY ANOMALY
4 NO SIGNAL ANOMALY NO SIGNAL ANOMALY
5 ANOMALY ANOMALY ANOMALY ANOMALY
6 NO SIGNAL NO SIGNAL ANOMALY ANOMALY发布于 2015-06-18 02:20:53
使用索引可能比使用ifelse()更快。首先设置所需长度的No的向量:
aggregates <- rep("No", NROW(residual_anomalies))然后索引这个向量,所有的residual_anomalies[, 2:4] == "ANOMALY"
aggregates[rowSums(residual_anomalies[, 2:4] == "ANOMALY") == 3L] <- "Yes"这提供了:
> aggregates
[1] "Yes" "No" "Yes" "No" "Yes" "No"此部件residual_anomalies[, 2:4] == "ANOMALY"创建一个逻辑矩阵:
> residual_anomalies[, 2:4] == "ANOMALY"
V2 V3 V4
[1,] TRUE TRUE TRUE
[2,] FALSE TRUE TRUE
[3,] TRUE TRUE TRUE
[4,] TRUE FALSE TRUE
[5,] TRUE TRUE TRUE
[6,] FALSE TRUE TRUE当我们使用rowsums()时,TRUE被转换为1,FALSE被转换为0。因此,只有那些所有元素都为TRUE的行才会被选中并分配"Yes"。
发布于 2015-06-18 02:12:17
根据@lukeA,你的代码中有一个拼写错误。它应该是
all(x == "ANOMALY")但这样做会更快:
residual_anomalies$Prediction_Anomaly <-
ifelse(rowSums(residual_anomalies[, 2:4] == "ANOMALY") == 3, "YES", "NO")rowSums非常快。
发布于 2015-06-18 02:12:47
正如@lukeA所说的,你把括号弄混了,但这里还有一个更简单的解决方案:
aggregates <- ifelse(apply(residual_anomalies, 1,
function(x) all(x[2:4] == "ANOMALY")), "YES", "NO")https://stackoverflow.com/questions/30898929
复制相似问题