如何解决如何引用R中的所有其他列?
我正在使用与以下数据类似的数据:
ID <- c("A","B","C","D","E")
x1 <- c(1,1,0)
x2 <- c(0,2,2)
x3 <- c(0,0)
x4 <- c(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 没有,我如何引用其他所有列而不必写出条件语句中的其余列?
解决方法
基本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→没有一个不等于零)
如果可能有NA
个值,那么您在na.rm=TRUE
规范中将需要一个rowSums()
使用select
,我们可以有多个选择。下一个是范围(:
),在此示例中,选择的列是从'x2'到'x4'并按顺序排列。如果我们要基于某些模式进行选择,可以使用matches("^x[2-9]$")
完成。
在下面的代码中,它在单个列'x1'上创建逻辑条件,其余列select
与rowSums
并与&
合并,然后输出将通过case_when
双向公式传递为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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。