2017-06-22 61 views
3

我与+分离字的数据帧df但不希望的顺序,当我执行分析无关紧要。例如,我有如何匹配不同的组合的字符串中的R

df <- as.data.frame(
     c(("Yellow + Blue + Green"), 
     ("Blue + Yellow + Green"), 
     ("Green + Yellow + Blue"))) 

目前,他们被视为三个独特的回应,但我希望他们被认为是相同的。我已经尝试过蛮力方法,如ifelse陈述,但它们不适合大型数据集。

有没有一种方法重新排列条款,使它们匹配或类似于反向combn函数,它可以识别它们是相同的组合,但顺序不同?

谢谢!

回答

6
#DATA 
df <- data.frame(cols = 
       c(("Yellow + Blue + Green"), 
        ("Blue + Yellow + Green"), 
        ("Green + Yellow + Blue"), 
        ("Green + Yellow + Red")), stringsAsFactors = FALSE) 

#Split, sort, and then paste together 
df$group = sapply(df$cols, function(a) 
    paste(sort(unlist(strsplit(a, " \\+ "))), collapse = ", ")) 
df 
#     cols    group 
#1 Yellow + Blue + Green Blue, Green, Yellow 
#2 Blue + Yellow + Green Blue, Green, Yellow 
#3 Green + Yellow + Blue Blue, Green, Yellow 
#4 Green + Yellow + Red Green, Red, Yellow 

#Or you can convert to factors too (and back to numeric, if you like) 
df$group2 = as.numeric(as.factor(sapply(df$cols, function(a) 
     paste(sort(unlist(strsplit(a, " \\+ "))), collapse = ", ")))) 
df 
#     cols    group group2 
#1 Yellow + Blue + Green Blue, Green, Yellow  1 
#2 Blue + Yellow + Green Blue, Green, Yellow  1 
#3 Green + Yellow + Blue Blue, Green, Yellow  1 
#4 Green + Yellow + Red Green, Red, Yellow  2 
+1

感谢d.b!奇妙的作品。我应该更具体的一件事是,我仍然希望它是a + b + c格式,但通过更改'collapse'语句可以轻松修复它。 – Ablum89

0

我想提供有关这个我采取的,因为目前还不清楚你想要什么格式的输出:

我用包stringriterators。使用df创建的d.b.

search <- c("Yellow", "Green", "Blue") 
L <- str_extract_all(df$cols, boundary("word")) 
sapply(iter(L), function(x) all(search %in% x)) 
[1] TRUE TRUE TRUE FALSE 
相关问题