【问题标题】:Match multiple strings with set values across data frames in R将多个字符串与 R 中跨数据帧的设置值匹配
【发布时间】:2020-04-29 02:25:48
【问题描述】:

我有一个数据集,其中包含在 ARABET 中转录的单词,如下所示:

dict <- data.frame(
              word=c("HH EH L P", "W IH TH", "S AH M . TH IY NG"))

我有另一个数据集,其中可能包含具有特定、对应(但最终是任意)值的 ARABET 段,如下所示:

ref <- data.frame(
              letter=c("HH", "EH", "L", "P", "W", "IH", "TH", "S", "AH", "M", "IY", "NG", "AA", "B"),
              value=c(1.34, 1.91, 2.45, 4.12, 2.12, .69, 5.1, 1.47, 1.98, 3.12, 1.35, 4.11, 1.23, 3.45))

我正在尝试为我的数据框 dict 中的每个单词计算匹配字母值的总和。例如,“HH EH L P”将等于 1.34 + 1.91 + 2.45 + 4.12 = 9.82。理想情况下,我想要一个看起来像这样的数据框:

dict_goal <- data.frame(
  word=c("H EH L P", "W IH TH", "S AH M . TH IY NG"),
  sum=c(9.82, 7.91, 17.1))

到目前为止,我的方法必须是将每个单词按空格拆分,将每个拆分单词临时移动到数据框中,连接相应的值,对这些值求和,然后将该总和附加回我的原始数据 (dict)按行。我尝试使用下面的代码,但它既麻烦又无效,因为它实际上并没有加入字母值(只是返回 NA 值)。求和和附加很简单,但我似乎无法做到这一点。注意:此代码依赖于 dplyr 和 stringr 包。

ref$value <- as.factor(ref.$value)
test <- data.frame()

for(i in 1:3){
  test <- str_split(dict[i,], " ")
  test <- as.data.frame(test)  
  colnames(test) <- c("letter")
  test <- left_join(test, ref,
                     by = c("letter" = "value"))
  }

任何帮助将不胜感激!

【问题讨论】:

  • 那是我的错! 17.1 是正确的输出。谢谢!

标签: r string dplyr match stringr


【解决方案1】:

您可以使用separate_rows获取长格式数据,并与ref连接得到对应的value。对于每个word,我们可以将sumvalue 放在一起。

library(dplyr)

dict %>%
  mutate(row = row_number()) %>%
  tidyr::separate_rows(word, sep = "\\s+") %>%
  left_join(ref, by = c('word' = 'letter'))  %>%
  group_by(row) %>%
  summarise(word = paste(word, collapse = " "), 
            value = sum(value, na.rm = TRUE)) %>%
  select(-row)


#  word              value
#  <chr>             <dbl>
#1 HH EH L P          9.82
#2 W IH TH            7.91
#3 S AH M . TH IY NG 17.1 

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 2014-09-20
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多