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

时间:2015-10-15 05:54:48

标签: r for-loop calculated-columns

我正在尝试找出一种从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 

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

我尝试了以下仅针对单个列

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

但它根本不起作用。

我收到消息'错误in if(df $ x [i] == 1){:缺少值,其中需要TRUE / FALSE'

这是有道理的,但我看不出在哪里放置TRUE / FALSE语句

2 个答案:

答案 0 :(得分:1)

你也可以使用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)

答案 1 :(得分:0)

我们可以使用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的帖子中创建'compCol'之前使用了数据集。