Как реплицировать строку в кадре данных индивидуально N раз - PullRequest
2 голосов
/ 08 октября 2019

У меня есть фрейм данных, и я хочу повторить ввод одной ячейки n раз в зависимости от ввода следующей, и отобразить его в новой ячейке.

Мой фрейм данных выглядит следующим образом:

data <- data.frame(c(1,1,2,3,4,4,4), c("A","B","A","C","D","E","A"), c(2,1,1,3,2,1,3))
colnames(data) <- c("document number", "term", "count")
data

Это мой желаемый результат:

datanew <- data.frame(c(1,2,3,4), c("A A B", "A", "C C C", "D D E A A A"))
colnames(datanew) <- c("document number", "term")


#   document number        term
# 1               1       A A B
# 2               2           A
# 3               3       C C C
# 4               4 D D E A A A

Так что, в принципе, мне нравится умножать ввод ячейки термина на ввод соответствующей ячейки счетчика. У кого-нибудь есть идеи, как его кодировать в R?

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Мы можем использовать rep для репликации term count раз и paste данных вместе.

library(dplyr)

data %>%
  group_by(`document number`) %>%
  summarise(new = paste(rep(term, count), collapse = " "))

# A tibble: 4 x 2
#  `document number` new        
#              <dbl> <chr>      
#1                 1 A A B      
#2                 2 A          
#3                 3 C C C      
#4                 4 D D E A A A

Аналогично data.table

library(data.table)
setDT(data)[, (new =  paste(rep(term, count), collapse = " ")), 
               by = `document number`]
0 голосов
/ 08 октября 2019

Мы можем сделать это с помощью tidyverse методов

library(dplyr)
library(tidyr)
library(stringr)
data %>%
   uncount(count) %>%
   group_by(`document number`) %>% 
   summarise(term = str_c(term, collapse=' '))
# A tibble: 4 x 2
#  `document number` term       
#              <dbl> <chr>      
#1                 1 A A B      
#2                 2 A          
#3                 3 C C C      
#4                 4 D D E A A A

Или с data.table

library(data.table)
setDT(data)[rep(seq_len(.N), count)][, .(term = 
        paste(term, collapse=' ')), `document number`]

Или с помощью base R с aggregate

aggregate(term ~ `document number`, data[rep(seq_len(nrow(data)), 
           data$count),], FUN = paste, collapse= ' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...