我尝试搜索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个关键字用逗号分隔。
答案 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 = ", ")
参数),这样我们就可以将它们放在一列数据中再一次。