首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在R中向量化这个操作,我不明白为什么这是错误的

尝试在R中向量化这个操作,我不明白为什么这是错误的
EN

Stack Overflow用户
提问于 2015-06-18 01:58:02
回答 3查看 50关注 0票数 1

我想循环通过一个数据框,并创建一个新列,如果行中的第二个到第四个元素是“ANOMALY”,则表示“YES”,否则表示“NO”。

代码语言:javascript
复制
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”。

代码语言:javascript
复制
vote_for_anomaly <- function(x){
  if (all(x)=='ANOMALY') return('YES') else
    return('NO')}

然后我尝试使用R中的apply函数

代码语言:javascript
复制
 aggregates <- apply(residual_anomalies[,2:4],1,vote_for_anomaly)

但是,我得到了以下错误/警告

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2015-06-18 02:20:53

使用索引可能比使用ifelse()更快。首先设置所需长度的No的向量:

代码语言:javascript
复制
aggregates <- rep("No", NROW(residual_anomalies))

然后索引这个向量,所有的residual_anomalies[, 2:4] == "ANOMALY"

代码语言:javascript
复制
aggregates[rowSums(residual_anomalies[, 2:4] == "ANOMALY") == 3L] <- "Yes"

这提供了:

代码语言:javascript
复制
> aggregates
[1] "Yes" "No"  "Yes" "No"  "Yes" "No"

此部件residual_anomalies[, 2:4] == "ANOMALY"创建一个逻辑矩阵:

代码语言:javascript
复制
> 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被转换为1FALSE被转换为0。因此,只有那些所有元素都为TRUE的行才会被选中并分配"Yes"

票数 1
EN

Stack Overflow用户

发布于 2015-06-18 02:12:17

根据@lukeA,你的代码中有一个拼写错误。它应该是

代码语言:javascript
复制
all(x == "ANOMALY")

但这样做会更快:

代码语言:javascript
复制
residual_anomalies$Prediction_Anomaly <-
  ifelse(rowSums(residual_anomalies[, 2:4] == "ANOMALY") == 3, "YES", "NO")

rowSums非常快。

票数 0
EN

Stack Overflow用户

发布于 2015-06-18 02:12:47

正如@lukeA所说的,你把括号弄混了,但这里还有一个更简单的解决方案:

代码语言:javascript
复制
aggregates <- ifelse(apply(residual_anomalies, 1, 
     function(x) all(x[2:4] == "ANOMALY")), "YES", "NO")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30898929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档