Фрейм данных с разной длиной строки - PullRequest
0 голосов
/ 31 мая 2018

У меня есть фрейм данных A с двумя столбцами, а именно «Количество» и «Количество раз».Я хотел бы создать новый кадр данных B, который повторяет «Количество» в кадре данных в соответствии с «Количество раз».Например, если первая строка в кадре данных A имеет «Ammount» = 50 и «Количество раз» = 4, а вторая строка имеет «Amount» = 80 и «Количество раз» = 2, я хочу создать новый кадр данныхB, как показано ниже:

50  50  50  50
80  80

Таким образом, строки кадра данных B будут иметь разную длину.Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Опция № 1:

Опция, использующая пакет splitstackshape::cSplit в виде:

df <- data.frame(Amt = c(50, 80), NoTime = c(4,2))

library(splitstackshape)


df_B <- data.frame(col = apply(df, 1, function(x)paste(rep(x[1],x[2]),collapse = ",")))

cSplit(df_B, "col", sep = ",")

#    col_1 col_2 col_3 col_4
# 1:    50    50    50    50
# 2:    80    80    NA    NA

Опция № 2: A tidyverse решение на основе может быть как:

library(tidyverse)
df$rn <- 1:nrow(df)

df_B <- df[rep(seq(nrow(df)), df$NoTime),]

df_B %>% select(-NoTime) %>%
  group_by(rn) %>%
  mutate(rowN = row_number()) %>%
  spread(rowN, Amt)
# # A tibble: 2 x 5
# # Groups: rn [2]
#      rn   `1`   `2`   `3`   `4`
# *   <int> <dbl> <dbl> <dbl> <dbl>
# 1     1  50.0  50.0  50.0  50.0
# 2     2  80.0  80.0  NA    NA  
0 голосов
/ 31 мая 2018

Вот один из способов сделать это, используя apply:

A <- data.frame(Amount = c(50, 80), Times = c(4, 2))
#   Amount Times
# 1     50     4
# 2     80     2

x <- apply(A, 1, function(r) {
         c(rep(r[['Amount']], r['Times']), rep(NA, max(A['Times'] - r['Times'])))
     })
t(x)
#      [,1] [,2] [,3] [,4]
# [1,]   50   50   50   50
# [2,]   80   80   NA   NA

Вот альтернатива, которая немного менее многословна:

> do.call(rbind, lapply(mapply(rep, A$Amount, A$Times), `length<-`, max(A$Times)))
     [,1] [,2] [,3] [,4]
[1,]   50   50   50   50
[2,]   80   80   NA   NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...