Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于R中的多个列,如何为其值大于其他值的行创建子集_R_Datatable - Fatal编程技术网

对于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))]