首页 文章

匹配R中两个数据帧之间的单词[重复]

提问于
浏览
0

这个问题在这里已有答案:

我在R工作,我有两个阿拉伯语数据框,如下所示是数据集的示例: Dataset 1: vocab

term
1:   شكرا
2:    رقي
3: تضيعون
4:   ابكي

Dataset 2: posneg

score     words 
1      ابكي      0
2      تضيعون     0
3      خسرت     0
4      ظلمونا     0
5      لا     0
6      مستهتر     0
7      وبلا     0
8      احباط     0
9      تفشلتوا     0
10      خسرتم     0
11      عقدتك     0
12      للاسف     0
13      مشكله     0
29      اضاع     0
30      حاقده     0
31      خطا     0
32      غير     0
33      ما     0 
116     ابدعوا     1
117     اهنيكم     1
118     حبا     1
119     شكرا     1
120     فرحه     1
121     ممتاز     1
122     وزعيما     1
123     اجتهد     1
124     باهر     1
125     حبك     1
126     صحيح     1
127     فزت     1

我需要在数据1中的 term 列和数据2中的 words 列之间进行比较,因此如果数据1中 term 列中的任何单词与数据2中单词列中的任何单词匹配,则给出相同的分数,如果单词不匹配,我想要写(新) . 这是我期望的结果:

score      term
1:   شكرا     1 
2:   1       رقي 
3:   0      تضيعون
4:   0        ابكي

这是我写的代码但是得到了一个错误 .

n<-length(vocab$term)
  n2<-length(posneg$words)


      for (i in 1:n) {
        if (vocab$term[i] == for (o in 1:n2) { posneg$words[o]}) 
          {
        vocab <- cbind(vocab, "score" = posneg$score[o] )} #add new column)
        else{
          vocab <- cbind(vocab, "score" = "no") #add new column
            }
        }

希望你了解我,谢谢!

2 回答

  • 2

    使用Pryore的数据和 data.table

    library(data.table)
    setDT(data1)
    setDT(data2)
    data2[data1, on = .(words = Term)]
       words score
    1:     A     1
    2:     B     4
    3:     Z    NA
    4:     D     2
    
  • 2

    萨拉姆

    不完全确定这是否是你想要的 . 不过,我使用tidyverse格式化if_else语句以匹配两个数据库中的单词列 . 如果单词出现在两者中,则将1打印到新数据,如果它们不打印,则打印0 .

    例如,

    library(tidyverse)
    
    data1 <- data.frame(Term = c("A","B","Z","D"))
    data2 <- data.frame(words = c("A","B","C","D","E","F"), score = c(1,4,5,2,4,5))
    
    data3 <- data1 %>%
      mutate(score = if_else(data1$term %in% data2$words, 1, 0))
    
    > str(data3)
    'data.frame':   4 obs. of  2 variables:
     $ Term : chr  "A" "B" "Z" "D"
     $ score: num  1 1 0 1
    

    这回答了你的问题了吗?

相关问题