将多列的阳性结果传递到 r 中的单个新列

passing positive results from multiple columns into a single new column in r

我正在尝试找出一种从 R 中的多列创建单列的方法。我想要做的是让 R 遍历多列的所有行,如果它在其中一个中找到肯定的结果这些列,将结果传递到 'amalgam' 列(抱歉,我不知道更好的词)。

查看下面的玩具数据集

x <- c(NA, NA, NA, NA, NA, 1)
y <- c(NA, NA, 1, NA, NA, NA)
z <- c(NA, 1, NA, NA, NA, NA)

df <- data.frame(cbind(x, y, z))

df[, "compCol"] <- NA

df

   x  y  z compCol
1 NA NA NA      NA
2 NA NA  1      NA
3 NA  1 NA      NA
4 NA NA NA      NA
5 NA NA NA      NA
6  1 NA NA      NA

我需要将每一列的阳性结果传递到 compCol 列,同时将阴性结果更改为 0。因此它看起来像这样。

   x  y  z compCol
1 NA NA NA       0
2 NA NA  1       3
3 NA  1 NA       2
4 NA NA NA       0
5 NA NA NA       0
6  1 NA NA       1 

我知道 if 可能需要嵌套在 for 循环中的 if else 语句,但我尝试过的所有方法都会导致我无法理解的错误。

我只针对一列尝试了以下操作

 for (i in 1:length(x)) {
    if (df$x[i] == 1) {
    df$compCol[i] <- df$x[i]
    }   
 } 

但是根本没有用。

我收到消息'Error in if (df$x[i] == 1) { : missing value where TRUE/FALSE needed'

这是有道理的,但我看不到 TRUE/FALSE 声明放在哪里

我们可以使用max.col。通过检查所选列是否大于 0 且不为 NA ('ind') 创建逻辑矩阵。我们使用 max.col 来获取每一行的列索引,并与 'ind' 的 rowSums 相乘,这样如果某行有 0 个 TRUE 值,则为 0。

 ind <- df > 0 & !is.na(df)
 df$compCol <- max.col(ind) *rowSums(ind)
 df$compCol
 #[1] 0 3 2 0 0 1

或者另一个选项是 pmax 乘以 col(df)

do.call(pmax,col(df)*replace(df, is.na(df), 0))
#[1] 0 3 2 0 0 1

注意:我在 OP 的 post.

中创建 'compCol' 之前使用了数据集

您还可以使用去除 NA 的整形

library(dplyr)
library(tidyr)

df.id = df %>% mutate(ID = 1:n() )

df.id %>%
  gather(variable, value, 
         x, y, z, 
         na.rm = TRUE) %>%
  left_join(df.id)