对于R中的多个列,如何为其值大于其他值的行创建子集
我有以下对于R中的多个列,如何为其值大于其他值的行创建子集,r,datatable,R,Datatable,我有以下数据。表 library(data.table) dt <- data.table(V1=c(1,3,1,0,NA,0), V2=c(1,0,1,0,1,3), Q1=c(3,5,10,14,0,3), Q2=c(0,1,8,NA,0,NA)) 编辑 原则上,我希望有两个列名称向量,因此类似于v_columms的东西,我们可以使用melt来处理多个列,方法是在measure中指定
数据。表
library(data.table)
dt <- data.table(V1=c(1,3,1,0,NA,0),
V2=c(1,0,1,0,1,3),
Q1=c(3,5,10,14,0,3),
Q2=c(0,1,8,NA,0,NA))
编辑
原则上,我希望有两个列名称向量,因此类似于v_columms的东西,我们可以使用melt
来处理多个列,方法是在measure
中指定模式,将其转换为“long”格式,然后应用条件
dt[, new := melt(dt, measure = patterns("V", "Q"))[,
+(any(value1 > 2) & any(value2 > 0)),rowid(variable)]$V1]
dt
# V1 V2 Q1 Q2 new
#1: 1 1 3 0 0
#2: 3 0 5 1 1
#3: 1 1 10 8 0
#4: 0 0 14 NA 0
#5: NA 1 0 0 0
#6: 0 3 3 NA 1
或者不使用melt
,如果只有两组列,则
vs <- grep("V", names(dt))
qs <- grep("Q", names(dt))
dt[, new := +(Reduce(`|`, lapply(.SD[, ..vs], `>`, 2)) &
Reduce(`|`, lapply(.SD[, ..qs], `>`, 0)))]
vs`,0))]
使用dplyr
和case\u when
或if\u else
:
dt %>%
mutate(new = case_when((V1 > 2 | V2 > 2) & (Q1 > 0 | Q2) > 0 ~ 1,
TRUE ~ 0))
dt %>%
mutate(new = if_else((V1 > 2 | V2 > 2) & (Q1 > 0 | Q2 > 0), 1 , 0))
V1 V2 Q1 Q2 new
1 1 1 3 0 0
2 3 0 5 1 1
3 1 1 10 8 0
4 0 0 14 NA 0
5 NA 1 0 0 0
6 0 3 3 NA 1
下面是另一种使用一些辅助函数的方法:
foo <- function(.dt, cols, vals, na.rm = TRUE) {
rowSums(.dt[, cols, with=FALSE] > vals, na.rm = na.rm) > 0
}
bar <- function(.dt, cols_list, vals_list) {
as.integer(Reduce("&", Map(function(cols, vals) foo(.dt, cols, vals), cols_list, vals_list)))
}
dt[, new := bar(.SD, list(v_columms, q_columms), list(2, 0))]
foo vals,na.rm=na.rm)>0
}
条形码>dt[(V1>2 | V2>2)和(Q1>0 | Q2>0),新的:=1]
?在现实中,你需要为更多的专栏做这些吗?也许更好:dt[,new:=as.integer((V1>2 | V2>2)和(Q1>0 | Q2>0))
是的,所以原则上我希望有2个向量,比如v|colums,看看我是否理解正确,如果我有3个模式V1
,我的情况是V1
,V2>2
和Q>0
然后我会使用dt[,new:=melt(dt,measure=patterns(“V1”,“V2”,“Q”)[,+(any(value1>1 | value2>2)和any(value3>0)),rowid(variable)]$V1]
?@quant是的,那是it@quant对于多个变量,也可以使用Map
即melt(dt,measure=patterns(“V”),“Q”)[,+(Reduce('&',Map(function(x,y)any(x>y),.SD,c(2,0))),by=rowid(variable),.SDcols=value1:value2]
在第二个解决方案中,我得到eval(expr,envir,enclose)中的错误:“…vs”未找到
though@quant那会有点旧。。
是最近推出的
foo <- function(.dt, cols, vals, na.rm = TRUE) {
rowSums(.dt[, cols, with=FALSE] > vals, na.rm = na.rm) > 0
}
bar <- function(.dt, cols_list, vals_list) {
as.integer(Reduce("&", Map(function(cols, vals) foo(.dt, cols, vals), cols_list, vals_list)))
}
dt[, new := bar(.SD, list(v_columms, q_columms), list(2, 0))]