将多列的阳性结果传递到 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)
我正在尝试找出一种从 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)