2016-06-05 5 views
2

дано 4х2 кадр данных, такие как:R: Expand dataframe строки

df <- 
    data.frame(
    X=c(1,3,6,10), 
    Y=c('A','K','K3', 'K')) 

Я хотел бы получить 10x2 строки dataframe были X 1,2, ... 10 (как и в соотношении 1:10), и Y тиражируется число раз, указанное в ф.р. $ X, например:

X Y 
1 1 A 
2 2 A 
3 3 K 
4 4 K 
5 5 K 
6 6 K3 
7 7 K3 
8 8 K3 
9 9 K3 
10 10 K 

только думаю, что я могу думать о том, чтобы построить Y обернув через'df' как (псевдокод):

for(i in 1:(nrow(df)-1)){ 
    Y <- c(Y,(rep.int(df$Y[i], df$X[i+1]-df$X[i])))} 

Кажется, комковатый. Может быть, пакеты, такие как reshape2 или splitstackshape, помогут мне?

+1

Вы также можете сделать 'splitstackshape :: expandRows (Д.Ф., с (дифференциал (ДФ $ X), 1), FALSE)', а затем исправить 'столбец x' или что-то –

+0

Или базовый параметр R transform (df [rep (1: nrow (df), c (diff (df $ X), 1)),], X = seq (max (df $ X))) ' – akrun

ответ

1

Мы можем использовать dplyr

library(dplyr) 
library(tidyr) 
data.frame(X= min(df$X):max(df$X)) %>% 
     left_join(., df, by = "X") %>% 
     fill(Y) 
# X Y 
#1 1 A 
#2 2 A 
#3 3 K 
#4 4 K 
#5 5 K 
#6 6 K3 
#7 7 K3 
#8 8 K3 
#9 9 K3 
#10 10 K 
+1

Отлично. Я забыл о тидире. – user3375672

+2

Или 'df%>% complete (X = full_seq (min (X): max (X), 1))%>% fill (Y)' –

 Смежные вопросы

  • Нет связанных вопросов^_^