Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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_Data.table - Fatal编程技术网

R 如何选择多列作为行选择的条件

R 如何选择多列作为行选择的条件,r,data.table,R,Data.table,比如说, set.seed(1984) d <- data.table(name=letters[1:26],a=rbinom(26,1,0.5),b=rbinom(26,1,0.5),c=rbinom(26,1,0.5)) 结果是: a b c name 1: 1 1 1 a 2: 1 1 1 u 3: 1 1 1 x 4: 0 1 0 b 5: 0 1 0 d 6: 0 1 0 h 7: 0 1 1 c 8: 0 1 1

比如说,

set.seed(1984)
d <- data.table(name=letters[1:26],a=rbinom(26,1,0.5),b=rbinom(26,1,0.5),c=rbinom(26,1,0.5))
结果是:

   a b c name
 1: 1 1 1    a
 2: 1 1 1    u
 3: 1 1 1    x
 4: 0 1 0    b
 5: 0 1 0    d
 6: 0 1 0    h
 7: 0 1 1    c
 8: 0 1 1    g
 9: 0 1 1    o
10: 0 1 1    q
11: 0 1 1    t
12: 1 1 0    e
13: 1 1 0    k
14: 1 1 0    y
15: 1 0 0    f
16: 1 0 0    i
17: 1 0 0    r
18: 1 0 0    s
19: 1 0 0    w
20: 0 0 1    j
21: 0 0 1    v
22: 1 0 1    m
23: 1 0 1    n
    a b c name
现在,我有两个问题:

  • 如何将“name”列保留为第一列
  • 如何选择a、b、c列作为简单表达式(如a:c,但a:c并不意味着a、b、c)?如果有数百列,我不能输入无尽的a,b,c。。。在和函数中,或作为由的参数
  • 增加问题:
    如果不是sum(具有处理行的rowSums版本),而是max等其他函数,如何解决问题1和问题2而不使用apply函数族(apply函数族是为数据帧设计的,我担心它们会降低数据表的速度)

    我们可以使用
    Reduce
    +
    根据
    .SDcols
    中指定的列创建逻辑向量

    d[d[, Reduce(`+`, .SD) != 0, .SDcols = a:c]]
    

    其他选项包括(@nicola's)

    或者按照@Frank的建议,使用
    pmax
    根据每行上的最大值创建列(“keep”),将其从二进制文件转换为
    逻辑文件,并基于该子集创建行和列

    d[, keep := as.logical(do.call(pmax, .SD)), .SDcols=!"name"][(keep), !"keep"]
    

    我们可以使用
    Reduce
    +
    来根据
    .SDcols
    中指定的列创建逻辑向量

    d[d[, Reduce(`+`, .SD) != 0, .SDcols = a:c]]
    

    其他选项包括(@nicola's)

    或者按照@Frank的建议,使用
    pmax
    根据每行上的最大值创建列(“keep”),将其从二进制文件转换为
    逻辑文件,并基于该子集创建行和列

    d[, keep := as.logical(do.call(pmax, .SD)), .SDcols=!"name"][(keep), !"keep"]
    

    您还可以使用
    rowSums
    函数:

     d[rowSums(d[,2:4])!=0,]
    

    您还可以使用
    rowSums
    函数:

     d[rowSums(d[,2:4])!=0,]
    

    类似于
    d[d[,rowSums(.SD)!=0.SDcols=a:c]
    ?类似于
    d[d[,rowSums(.SD)!=0.SDcols=a:c]
    ?同样
    d[Reduce(“+”,d[,a:c])!=0]
    似乎有效(不使用
    .SDcols
    )。考虑到它们是二进制变量,pmin或pmax似乎更自然。我会做
    d[,keep:=as.logical(do.call(pmax.SD)),.SDcols=!“name”[(keep),!“keep”]
    或类似的操作。另外
    d[Reduce(“+”,d[,a:c])!=0]
    似乎可以工作(不使用
    .SDcols
    )。考虑到它们是二进制变量,pmin或pmax看起来更自然。我会做
    d[,keep:=as.logical(do.call(pmax.SD)),.SDcols=!“name”][(keep),!“keep”]
    或类似的操作。我陷入了DT[I,j,by]的陷阱,并将函数T_TAm应用到DT包中,效果不太好。。还在学习呢。随着时间的推移,我将能够拿起。我掉进了DT[I,j,by]的陷阱,并应用函数T_TAm,但DT包不太好。。还在学习呢。随着时间的推移,我将能够拿起。