Сопоставить несколько строк с заданными значениями в кадрах данных в R - PullRequest
1 голос
/ 29 апреля 2020

У меня есть один набор данных со словами, транскрибированными в ARPABET, например:

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

У меня есть другой набор данных, в котором есть возможные сегменты ARPABET с указанным c, соответствующим (но в конечном итоге произвольным) значением, чем-то как показано ниже:

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 LP" будет равно 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"))
  }

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 29 апреля 2020

Вы можете получить данные в длинном формате, используя separate_rows, и присоединить их к ref, чтобы получить соответствующий value. Для каждого word мы можем затем sum value вместе.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...