R 数据分解的 ifelse 函数

ifelse function for R data factoring

我有一个如下所示的数据框:

name pos1 pos2 pos3
A 0.56 0.2 0.24
B NA 0.72 0.1
C NA NA NA
D 0.1 0.02 0.1

列表继续到 ~500 行。

在预测数据集中,我想将 TRUE 设置为 any 位置的数字大于 0.5。我真的不在乎它是否包含 NA,我只需要知道它至少有一个值 >0.5 的位置。

但是,我真的不需要所有位置都有 NA 的行。

我目前的代码是:

PRED <- factor (rep(ifelse(data$pos1 > 0.500 | data$pos2 > 0.500 |
                               data$pos3 > 0.500 ,
                               TRUE, FALSE)))

当我尝试这段代码时,它在正确检测真/假时完成了工作,但对于具有 1 / 2 NA 的行,它一直将其分解为 NA(而不是 T 或 F)。

我需要对当前代码进行哪些更改才能实现此目的? 这样只有当所有三个位置都是 NA 时才能获得 NA 输出。

非常感谢任何帮助!

df [2:4] %>% 
apply(1,function(x) any(x[1]>0.5,x[2]>0.5,x[3]>0.5,na.rm = T)) %>% 
cbind(df)

这不是一个优雅的解决方案,但您可以使用 dplyr 包中的 case_when()

data <- 
  data.frame(Name = LETTERS[1:5],
             pos1 = c(5,0.22,NA,0,NA),
             pos2 = c(0.2,NA,1,0,NA),
             pos3 = c(NA,0.1,0.3,0.1,NA))

library(dplyr)
data <- data %>% 
  mutate(PRED = factor(case_when(pos1 > 0.500 ~ TRUE,
                          pos2 > 0.500 ~ TRUE,
                          pos3 > 0.500 ~ TRUE,
                          is.na(pos1) & is.na(pos2) & is.na(pos3) ~ NA,
                          TRUE ~ FALSE)))

这将在新列中生成因子

> data$PRED
[1] TRUE  FALSE TRUE  FALSE <NA> 
Levels: FALSE TRUE