跨列的字符串匹配的迭代计数R

brc7rcf0  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(105)

我有一个包含两列字符串的数据框

x <- data.frame(a = c("HH UH D", "L EH . M IH N", "EH K . S AE M . P EL"),
                b = c("HH UH F", "L IY . V IH NG", "S AE M . P EL"))

我试图计算 column b,row 1 中的字符与 column a,row 1 中的字符匹配的次数,然后将 column b,row 2column a,row 2 匹配,以此类推,然后将此计数作为一个新列相加,因此此计算的输出如下所示:

x <- data.frame(a = c("HH UH D", "L EH . M IH N", "EH K . S AE M . P EL"),
                b = c("HH UH F", "L IY . V IH NG", "S AE M . P EL"), 
                c = c(2, 2, 5)) # HH and UH match, so 2 
                                # L and IH match, so 2 
                                # S, AE, M, P, and EL all match, so 5

我试过这样的方法:

a_characters <- str_split(x$a, " ")
b_characters <- str_split(x$b, " ")
stringcounting <- data.frame()

for (letter in b_characters){
  count <- str_count(a_characters, letter)
  sum_count <- sum(count)
  stringcounting <- rbind(stringcounting, sum_count)
}

但这里的结果是:1,50,20而不是2,2,5(不知道为什么)。我想我的for循环出了问题,也可能是我把字符串拆分成字符的方式出了问题,但我不确定是什么问题。

6ojccjat

6ojccjat1#

我们可以在拆分字符串后删除".",因为我们不想比较它,也不想使用%in%sum计算匹配的字符串。

mapply(function(x, y) sum(x[x != "."] %in% y[y!= "."]), 
                      a_characters, b_characters)
#[1] 2 2 5
ss2ws0br

ss2ws0br2#

下面是一个函数可以做到这一点:

library(stringr)

    matching_words_count <- Vectorize(function(column1,column2){
        return(sum(str_split_1(column1," ") %in% str_split_1(column2," ")))
      })
  
    # use
    df$new_column <- matching_words_count(df$a,df$b)

相关问题