【问题标题】:Iterative counting of string matches across columns R跨列 R 的字符串匹配的迭代计数
【发布时间】:2020-06-29 03:07:21
【问题描述】:

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

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"))

我正在尝试计算 b 列第 1 行 中的字符与 a 列第 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 循环出了点问题,也可能是我将字符串拆分为字符的方式,但我不确定是什么。

【问题讨论】:

    标签: r string text split match


    【解决方案1】:

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

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

    【讨论】:

    • 这与我得到的输出不同。我根据匹配得到(1 或 0)的每个字符,它返回所有 0 以匹配“S AE M P EL”中的字符。
    • @Ian 您使用的数据与您的帖子中显示的相同吗?它给了我预期的输出,如图所示。
    • 啊!对于那个很抱歉。我早些时候玩弄时不小心取消了我的 str_splits 并且没有将它们改回来。删除后,我得到相同的输出。非常感谢!
    猜你喜欢
    • 2010-12-11
    • 2015-08-10
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2017-10-22
    • 2022-11-11
    相关资源
    最近更新 更多