如何获取逗号分隔字符串的所有可能顺序

时间:2017-09-11 07:04:05

标签: r algorithm dataframe permutation

我尝试搜索R问题,但找不到任何有用的东西。

我有一个这样的数据框:

Post_ID New_Mentions_1      New_Mentions_2
   1          model                      
   2      telephone          louis vuitton
   3           uber          employee
   4   united states                      
   5          onion         pepper, rice, garlic

我的预期结果是使用New_Mention_2的所有可能订单扩展数据框

 Post_ID New_Mentions_1      New_Mentions_2
   1          model                      
   2      telephone           louis vuitton
   3           uber            employee
   4   united states                      
   5          onion        pepper,rice,garlic
   5          onion        rice,garlic,pepper
   5          onion        garlic,pepper,rice
   5          onion        pepper,garlic,rice
   5          onion        garlic,rice,pepper
   5          onion        rice,pepper,garlic

请帮我一个程序。我也有几行,其中5个关键字用逗号分隔。

1 个答案:

答案 0 :(得分:0)

应该有一种更简单的方法来解决这个问题,但我似乎无法找到它。

为了确保我们正在讨论相同的数据框,我会重新发布您的数据:

df <- structure(list(New_Mentions_1 = c("model", "telephone", "uber", 
        "united_states", "onion"), New_Mentions_2 = c(NA, "louis_vuitton", 
        "employee", NA, "pepper,rice,garlic")), .Names = c("New_Mentions_1", 
        "New_Mentions_2"), class = "data.frame", row.names = c(NA, -5L))

首先,使用df检查New_Mentions_2列中grep列中的哪些行有多个值。此函数返回第二列包含逗号值的行。然后我们在不需要修复的部分中分割数据帧(即在第二列中没有逗号值)并将其称为newdf。需要修复的部分称为subdf

我们会在subdf稍微混淆(代码下面的详细信息)以获取值的所有可能组合,并将结果附加到newdf数据框:

library(gtools)
# Which rows in df have multiple values in the second column?
inds <- grep(pattern = ",", df$New_Mentions_2)

subdf <- df[inds, ]
newdf <- df[-inds, ]

# Just in case you have multiple 'problematic' rows, we'll loop through all of them
for(i in 1:nrow(subdf)){
  splitted <- strsplit(subdf$New_Mentions_2[i], ", ")[[1]]
  n        <- length(splitted)
  shuffled <- permutations(n, n)
  for(j in 1:nrow(shuffled)){
    val_2 <- paste(splitted[shuffled[j, ]], collapse = ", ")
    val_1 <- subdf$New_Mentions_1[i]
    newdf <- rbind(newdf, c(val_1, val_2))
  }
}

'乱搞'部分主要在外循环中执行。首先,例如,每个,(逗号+空格)都会分开“胡椒,米饭,大蒜”。然后,splitted会包含c("pepper", "rice", "garlic"),我们会使用gtools-package中的permutations函数获取所有可能的组合。在内部循环的第一行中,混洗后的字符串将被放回一个字符串(paste()collapse = ", ")参数),这样我们就可以将它们放在一列数据中再一次。