R 从列创建布尔表达式
我有这样一个数据框:R 从列创建布尔表达式,r,R,我有这样一个数据框: set1,set2,set3 "test1","test12","test13" "test2","test22","test23" 我想创建基于所有列的所有可能组合的布尔表达式,并使用第一列作为基础 基于上述df的输出示例: ("test1" AND "test12" AND "test13") ("test1" AND "test22" AND "test23") ("test2" AND "test12" AND "test13") ("test2" AND "te
set1,set2,set3
"test1","test12","test13"
"test2","test22","test23"
我想创建基于所有列的所有可能组合的布尔表达式,并使用第一列作为基础
基于上述df的输出示例:
("test1" AND "test12" AND "test13")
("test1" AND "test22" AND "test23")
("test2" AND "test12" AND "test13")
("test2" AND "test22" AND "test23")
有什么简单的方法吗?我试过这个:
set1 <- read.csv("C:/Users/Desktop/set.csv", header=TRUE, sep=",")
df <- data.frame()
i <- 1
for (i in 1:nrow(set1$set1)) {
j <- 1
for (j in 1:nrow(set1$set2)) {
k <- 1
for (k in 1:nrow(set1$set3)) {
df <- paste(set1$set1[i]," AND ",set1$set2[j]," AND ", set1$set3[k])
}
}
}
set1一个想法是,首先我们创建一个新列来粘贴set2
和set3
,以避免出现(“test1”和“test22”以及“test13”)之类的字符串。然后,我们通过expand.grid
和paste
创建组合,即
df1$new <- do.call(paste, c(df1[,(2:3)], sep = ' AND '))
do.call(paste, c(expand.grid(df1[,-(2:3)]), sep = ' AND '))
#[1] "test1 AND test12 AND test13" "test2 AND test12 AND test13" "test1 AND test22 AND test23" "test2 AND test22 AND test23"
数据
dput(df1)
structure(list(set1 = c("test1", "test2"), set2 = c("test12",
"test22"), set3 = c("test13", "test23")), .Names = c("set1",
"set2", "set3"), class = "data.frame", row.names = c(NA, -2L))
编辑
由于您希望在每个“test”
周围保留引号,因此
#as before,
v1 <- do.call(paste, c(expand.grid(df1), sep = ' AND '))
v2 <- paste0('(', sapply(lapply(strsplit(v1, ' AND '), function(i) dQuote(i)),
function(j) paste(j, collapse = ' AND ')), ')')
#1 (“test1” AND “test12” AND “test13”)
#2 (“test2” AND “test12” AND “test13”)
#3 (“test1” AND “test22” AND “test13”)
#4 (“test2” AND “test22” AND “test13”)
#5 (“test1” AND “test12” AND “test23”)
#6 (“test2” AND “test12” AND “test23”)
#7 (“test1” AND “test22” AND “test23”)
#8 (“test2” AND “test22” AND “test23”)
#如前所述,
v1有什么我应该更新的问题吗?(“test1”和“test22”以及“test13”)怎么样?
?谢谢。我尝试了所有组合的命令。只有一个问题,我认为结果“test1和test12和test13”与我的示例输出不同(“test1”和“test22”和“test13”)
哦,你也希望它用括号括起来,并在每个“test”周围加引号?是的,因为它们是不同的表达式
#as before,
v1 <- do.call(paste, c(expand.grid(df1), sep = ' AND '))
v2 <- paste0('(', sapply(lapply(strsplit(v1, ' AND '), function(i) dQuote(i)),
function(j) paste(j, collapse = ' AND ')), ')')
#1 (“test1” AND “test12” AND “test13”)
#2 (“test2” AND “test12” AND “test13”)
#3 (“test1” AND “test22” AND “test13”)
#4 (“test2” AND “test22” AND “test13”)
#5 (“test1” AND “test12” AND “test23”)
#6 (“test2” AND “test12” AND “test23”)
#7 (“test1” AND “test22” AND “test23”)
#8 (“test2” AND “test22” AND “test23”)