如何引用 R 中的所有其他列?

How to reference all other columns in R?

我正在处理类似于以下数据的数据:

ID <- c("A", "B", "C", "D", "E")
x1 <- c(1,1,1,1,0)
x2 <- c(0,0,1,2,2)
x3 <- c(0,0,0,0,0)
x4 <- c(0,0,0,0,0)

df <- data.frame(ID, x1, x2, x3, x4)

看起来像:

> df
  ID x1 x2 x3 x4
1  A  1  0  0  0
2  B  1  0  0  0
3  C  1  1  0  0
4  D  1  2  0  0
5  E  0  2  0  0

我想创建一个新列,它是条件语句的乘积:如果x1 == 1all the other columns are equal to 0,则编码为"Positive"

如何引用 x1 以外的所有其他列 而不必 写出条件语句中的其余列?

有了select,我们可以有多种选择。下面的是范围(:),在示例中,列selected 是从'x2' 到'x4' 的顺序。如果我们想 select 基于一些模式,可以用 matches("^x[2-9]$").

来完成

在下面的代码中,它在单个列 'x1' 上创建逻辑条件,其余列 select 使用 rowSums 编辑,使用 [=16] 连接在一起=],然后将输出传递给 case_when two-sided 公式作为 lhs,替换值作为 ~ 的 rhs。默认情况下,所有其他不满足条件的元素将是 NA

library(dplyr)
df %>%
    mutate(new = case_when(x1 == 1 &
           rowSums(select(., x2:x4)!= 0) == 0~ 'Positive'))
# ID x1 x2 x3 x4      new
#1  A  1  0  0  0 Positive
#2  B  1  0  0  0 Positive
#3  C  1  1  0  0     <NA>
#4  D  1  2  0  0     <NA>
#5  E  0  2  0  0     <NA>

基础 R:

df$new <- ifelse(df$x1==1 &                  ## check x1 condition
                 rowSums(df[,3:5]!=0)==0),   ## add the logical outcomes by row
                 "Positive",
                 "not_Positive"))

第二行有点棘手。

  • df[,3:5](或df[,-(1:2)])选择除前两列之外的所有列。您也可以在此处使用 subset(df,select=x2:x4)(尽管 ?subset 表示“警告:这是一个用于交互使用的便利函数...”)
  • !=0 测试值是否为 0,返回 TRUEFALSE
  • rowSums() 将值相加 (FALSE→0, TRUE →1)
  • 如果在转换为数字时该行中的所有逻辑值都为零,则行总和为零(→ 所有 FALSE → none 等于零)

如果可能有 NA 个值,那么您的 rowSums() 规范中需要一个 na.rm=TRUE