交叉引用列表列表并在匹配时附加子列表

时间:2017-04-27 22:13:04

标签: r string text dataframe cross-reference

很抱歉标题不够清晰 - 我很难解释我的需要。

我有一个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中任何一个子列表中是否存在相应的字符串,如果匹配为{ {1}},我想将此子列表附加到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

或许也有办法对此进行矢量化?

1 个答案:

答案 0 :(得分:0)

我认为这可以根据您的数据完成您想要的内容:

#include <stdio.h>
int LowWatts(int burritos);
int MediumWatts(int burritos);
int HighWatts(int burritos);
int main ()
{

int burritos, menuSelect;
float Results;
burritos = (double)1; 


while (burritos > 0)
{
 printf ("Enter the amount of burritos you wish to cook \n: ");
 scanf("%d", &burritos);
 printf("%d\n", burritos);

 if (burritos > 0)
 {
 printf ("Enter 1 1100W, 2 to 1200W, 3 1250W microwave \n: ");
 scanf("%d", &menuSelect);
 printf("%d\n", menuSelect);
 if (menuSelect == 1)
 {
 Results = LowWatts(burritos);
 printf("For %d burrito(s) %.2f minutes is recomended for "
 "1100W microwave\n", burritos, Results);
 }
 else if (menuSelect == 2)
 {
 Results = MediumWatts(burritos);
 printf("For %d burrito(s) %.2f minutes is recomended for "
 "1200W microwave\n", burritos, Results);
 }
  else if (menuSelect == 3)
 {
 Results = HighWatts(burritos);
 printf("For %d burrito(s) %.2f minutes is recomended for "
 "1250W microwave\n", burritos, Results);
 }
 else
 printf("\nInvalid selection, please choose 1, 2, or 3 \n");
 } 
 } 
return 0;
}
int LowWatts(int burritos)
{
 return (double)(burritos*1.10);
} 

int MediumWatts(int burritos)
{
 return burritos*1.00;
}

int HighWatts(int burritos)
{
 return burritos*0.55;
}

我知道这不是一个非常&#34; R&#34;方法,所以我猜测一个真正的R用户会知道如何使用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 或其他一些我仍然无法真正做到的其他函数在大约2行中做同样的事情我还没把头包住。但是,如果您的数据集很小,则可能没问题。