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

R:计算逻辑和列间数据的有效方法

R:计算逻辑和列间数据的有效方法,r,dplyr,R,Dplyr,我想计算除第一个id列之外的每列之间的“and”组合。我通过两个for循环实现了它。但是,如果对于较大的列和行大小,以下方法会变得非常缓慢。有没有什么有效的办法 library(dplyr) Input <- data_frame(id=1:4, c1=c(T,T,F,F), c2=c(T,F,F,F),c3=c(F,T,F,F)) id c1 c2 c3 1 1 TRUE TRUE FALSE 2 2 TRUE FALSE TRUE 3

我想计算除第一个id列之外的每列之间的“and”组合。我通过两个for循环实现了它。但是,如果对于较大的列和行大小,以下方法会变得非常缓慢。有没有什么有效的办法

library(dplyr)
Input <- data_frame(id=1:4, c1=c(T,T,F,F), c2=c(T,F,F,F),c3=c(F,T,F,F))
    id    c1    c2    c3
  1  1  TRUE  TRUE FALSE
  2  2  TRUE FALSE  TRUE
  3  3 FALSE FALSE FALSE
  4  4 FALSE FALSE FALSE
对于循环方法:

Output <- data_frame(id=Input$id)
colSize <- ncol(Input)
colnms <- colnames(Input)
for(i in 2:(colSize-1)){
 for (j in (i+1):colSize){
   name_i <- paste(colnms[i],colnms[j],sep="_")
   logic_and <- (Input[colnms[i]]&Input[colnms[j]])
   Output$name <- logic_and
   names(Output)[ncol(Output)] <- name_i
  }
}

Output一个选项是
combn
from
base R

Input[-1] <- do.call(cbind, combn(Input[-1], 2, FUN = function(x) list(x[1] & x[2])))
names(Input)[-1] <- combn(names(Input)[-1], 2, FUN = paste, collapse="-")
Input
# A tibble: 4 × 4
#     id `c1-c2` `c1-c3` `c2-c3`
#   <int>   <lgl>   <lgl>   <lgl>
#1     1    TRUE   FALSE   FALSE
#2     2   FALSE    TRUE   FALSE
#3     3   FALSE   FALSE   FALSE
#4     4   FALSE   FALSE   FALSE

Input[-1]hi@akrun,combn运行良好。如果所有的都是假的,你知道如何避免列ci_cj吗?@HappyCoding你可以使用
m1
Input[-1] <- do.call(cbind, combn(Input[-1], 2, FUN = function(x) list(x[1] & x[2])))
names(Input)[-1] <- combn(names(Input)[-1], 2, FUN = paste, collapse="-")
Input
# A tibble: 4 × 4
#     id `c1-c2` `c1-c3` `c2-c3`
#   <int>   <lgl>   <lgl>   <lgl>
#1     1    TRUE   FALSE   FALSE
#2     2   FALSE    TRUE   FALSE
#3     3   FALSE   FALSE   FALSE
#4     4   FALSE   FALSE   FALSE