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