我正在尝试找出一种从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语句
答案 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'之前使用了数据集。