Сформируйте предложение из слов и их частоты - PullRequest
1 голос
/ 25 апреля 2020

У меня есть data.frame как следующее

df=data.frame(id=c("term 1", "term 1", "term 1", "term 2", "term 2", "term 3","term 3"), word1=c("hi", 
"love", "wind", "by", "Jack", "yellow", "hate"),word2=c("love", "France", "green", "best", "black", 
"bye", "by"),freq=c(2,1,1,2,2,1,1))

, что приводит к:

>df
      id  word1  word2 freq
1 term 1     hi   love    2
2 term 1   love France    1
3 term 1   wind  green    1
4 term 2     by   best    2
5 term 2   Jack  black    2
6 term 3 yellow    bye    1
7 term 3   hate    bye    1

Я хотел бы получить предложение из этого для каждого термина id в data.frame df с учетом частоты в freq. Например:

"hi love hi love France wind green"
"by best by best Jack black Jack black"
"yellow bye hate"

Я пытался выполнить это, но моя попытка

rep(paste(df$word1, df$word2, sep = " "),df$freq)

дает неверный результат:

 > rep(paste(df$word1, df$word2, sep = " "),df$freq)
[1] "hi love"     "hi love"     "love France" "wind green"  "by best"    
[6] "by best"     "Jack black"  "Jack black"  "yellow bye"  "hate by"

Ответы [ 3 ]

3 голосов
/ 25 апреля 2020

Другое базовое решение R

dfout <- aggregate(word~id,
                   transform(df[rep(seq(nrow(df)),df$freq),1:3,],word = paste(word1,word2)),
                   paste,
                   collapse = " ")

или

dfout <- aggregate(. ~ id,
                   data.frame(id = rep(df$id,df$freq),
                              words = rep(do.call(paste,df[c("word1","word2")]),df$freq),
                              stringsAsFactors = FALSE),
                   paste,
                   collapse = " ")

, которое дает

> dfout
      id                                  words
1 term 1 hi love hi love love France wind green
2 term 2  by best by best Jack black Jack black
3 term 3                     yellow bye hate by
2 голосов
/ 25 апреля 2020

Опция с data.table

library(data.table)
setDT(df)[rep(seq_len(.N), freq)][, .(value = paste(word1, word2,
         sep= ' ', collapse=' ')),.(id)]
#      id                                  value
#1: term 1 hi love hi love love France wind green
#2: term 2  by best by best Jack black Jack black
#3: term 3                     yellow bye hate by
2 голосов
/ 25 апреля 2020

Один из способов - объединить word1 и word2 с unite, повторить строки, используя uncount, и вставить значения для каждого id.

library(dplyr)
library(tidyr)

df %>%
  unite(word, word1, word2, sep = " ") %>%
  uncount(freq) %>%
  group_by(id) %>%
  summarise(value = paste(word, collapse = " "))

# A tibble: 3 x 2
#  id     value                                 
#  <fct>  <chr>                                 
#1 term 1 hi love hi love love France wind green
#2 term 2 by best by best Jack black Jack black 
#3 term 3 yellow bye hate by       

В базе R мы можем использовать tapply:

tapply(rep(paste(df$word1, df$word2), df$freq), 
       rep(df$id, df$freq), paste, collapse = " ")            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...