2016-09-11 3 views
-1

У меня есть кадр данных, как это:Создания логических выражений из столбцов

set1,set2,set3 
"test1","test12","test13" 
"test2","test22","test23" 

Я хотел бы создать логические выражения, основанные на И accross все возможные комбинации всех столбцов, используя в качестве базы первого столбца.

Пример вывода на основе вышеприведенного ДФ:

("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]) 
} 
} 
} 
+0

Есть ли что-нибудь, что я должен уточнить? –

+0

как насчет '(" test1 "AND" test22 "AND" test13 ")'? – Sotos

ответ

0

Одна идеи, сначала создать новый столбец, чтобы вставить set2 и set3 так, чтобы избежать таких строк, как ("test1" AND "test22" AND "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" 

Если вы хотите, чтобы все комбинации, тогда

do.call(paste, c(expand.grid(df1), sep = ' AND ')) 
#[1] "test1 AND test12 AND test13" "test2 AND test12 AND test13" "test1 AND test22 AND test13" "test2 AND test22 AND test13" 
#[5] "test1 AND test12 AND test23" "test2 AND test12 AND test23" "test1 AND test22 AND test23" "test2 AND test22 AND test23" 

DATA

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)) 

EDIT Так как вы хотите сохранять котировки вокруг каждого "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”) 
+0

Спасибо. Я попробовал команду со всеми комбинациями. Только один вопрос, я думаю, результат '" test1 И test12 И test13 "' отличается от моего примера output '(" test1 "AND" test22 "AND" test13 ")' –

+0

О, вы также хотите, чтобы он был заключен в скобки и с кавычками вокруг каждого «теста»? – Sotos

+0

Да, потому что они разные выражения –

Смежные вопросы