[英]Cross-referencing a list of lists and appending the sublist if there is a match
抱歉,標題不夠清晰-我很難解釋我的需求。
我有一個包含文本的data.frame
,例如:
text <- c("a",
"bb",
"c ccc",
"fff")
text_df <- data.frame(line = 1:length(text), text = text, stringsAsFactors = FALSE)
此外,我還有一個列表,其中包含要交叉引用的文本:
lol <- list(c('a', 'aa', 'aaa'),
c('d', 'dd', 'ddd'),
c('e', 'ee', 'eee'),
c('c', 'cc', 'ccc', 'cccc'),
c('b', 'bb', 'bbb'),
c('f', 'ff', 'fff'))
我想做的是:對於text_df
中每一行中的每個字符串,我想查看lol
任何子列表中是否有相應的字符串,如果match為TRUE
,我想將此子列表追加到以下行中text_df
。
這樣該操作的最終結果是:
>text_df_new
line text
1 a aa aaa
2 b bb bbb
3 c cc ccc cccc
4 f ff fff
我真的不明白該怎么做。 我猜想偽代碼看起來像這樣:
for text in texts:
for l in lol:
if strsplit(text[text]) %in% lol[l]:
text <- c(text, lol[l])
也許有一種矢量化方法?
我認為以上數據可以滿足您的要求:
check_text <- function(df, list){
tdf <- df
for(i in 1:length(df$text)){
x <- unlist(strsplit(df$text[i], split = " "))
for(j in x){
for(k in lol){
for(l in k){
if(j == l){
tdf$text[i] <- paste(k, collapse = " ")
}
}
}
}
}
return(tdf)
}
text_df_new <- check_text(text_df, lol)
> text_df_new
line text
1 1 a aa aaa
2 2 b bb bbb
3 3 c cc ccc cccc
4 4 f ff fff
我知道這不是一個非常“ R”的方法,所以我猜一個真正的R用戶將對如何使用apply
或我還沒有使用的其他功能之一在大約兩行中做同樣的事情有所了解還沒真正把我的頭纏起來。 但是,如果您的數據集很小,那可能就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.