我面临以下R转换问题。 我有以下数据框:
test_df <- structure(list(word = c("list of XYZ schools",
"list of basketball", "list of usa"), results = c("58", "151", "29"), key_list = structure(list(`coRq,coG,coQ,co7E,coV98` = c("coRq", "coG", "coQ", "co7E", "coV98"), `coV98,coUD,coHF,cobK,con7` = c("coV98","coUD", "coHF", "cobK", "con7"), `coV98,coX7,couC,coD3,copW` = c("coV98", "coX7", "couC", "coD3", "copW")), .Names = c("coRq,coG,coQ,co7E,coV98", "coV98,coUD,coHF,cobK,con7", "coV98,coX7,couC,coD3,copW"))), .Names = c("word", "results", "key_list"), row.names = c(116L, 150L, 277L), class = "data.frame")
简而言之,有三列,在“word”上是唯一的,然后是相应的“key_list”,其中包含以逗号分隔的键列表。我有兴趣创建一个新的数据框,其中每个密钥都是唯一的,并且单词信息是重复的以及结果信息。 所以数据框看起来如下:
key word results
coV98 "list of XYZ schools" 58
coRq "list of XYZ schools" 58
coV98 "list of basketball" 151
coV98 "list of usa" 29
等等所有键,所以我想扩展键将它们取消列表,然后重新形成一个包含重复单词和其他列的数据帧。
我尝试过以下一堆: 创建了一个唯一的键列表,然后尝试grep列中的每个键并循环创建一个新的较小的数据帧,然后将它们组合在一起,但结果数据帧不包含键列:
keys <- as.data.frame(table(unname(unlist(test_df$key_list))))
ttt <- lapply(keys, function(xx){
idx <- grep(xx, test_df$key_list)
df <- all_data_sub[idx,]})
final_df <- do.call(rbind, ttt)
我也参与了不公开和重塑,但我没有得到正确的组合。 任何建议都会很棒! 感谢
答案 0 :(得分:4)
我们可以使用-g
^\d+(?:,\s*\d+){4}
listCol_l
答案 1 :(得分:3)
如果基础R解决方案对某人有帮助:
do.call(rbind, lapply(seq_along(test_df$key_list), function(i) {
merge(test_df$key_list[[i]], test_df[i,-3], by=NULL)
}))