如何引用 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 == 1
和all 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,返回 TRUE
或 FALSE
rowSums()
将值相加 (FALSE
→0, TRUE
→1)
- 如果在转换为数字时该行中的所有逻辑值都为零,则行总和为零(→ 所有 FALSE → none 不 等于零)
如果可能有 NA
个值,那么您的 rowSums()
规范中需要一个 na.rm=TRUE
我正在处理类似于以下数据的数据:
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 == 1
和all 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,返回TRUE
或FALSE
rowSums()
将值相加 (FALSE
→0,TRUE
→1)- 如果在转换为数字时该行中的所有逻辑值都为零,则行总和为零(→ 所有 FALSE → none 不 等于零)
如果可能有 NA
个值,那么您的 rowSums()
规范中需要一个 na.rm=TRUE