Перестановка фрейма данных в R - PullRequest
4 голосов
/ 29 августа 2010

Следующий код R генерирует фрагмент из фрейма данных, с которым я сейчас работаю:

rep1 <- c("20/02/01","23/03/02")
rep2 <- c(NA, "03/05/02")
rep3 <- c("16/04/01",NA)
rep4 <- c(NA,"12/02/03")
data <- data.frame(rep1 = rep1, rep2 = rep2, rep3 = rep3, rep4 = rep4)

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

      rep1     rep2     rep3     rep4
1 20/02/01     <NA> 16/04/01     <NA>
2 23/03/02 03/05/02     <NA> 12/02/03

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

      rep1     rep2   rep3     rep4
1 20/02/01 16/04/01    <NA>     <NA>
2 23/03/02 03/05/02   12/02/03   <NA> 

То есть для каждой строки я хотел бы заменить каждый NA следующей записью в строке, пока не останется только NA.в строке.

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

Если бы кто-нибудь мог сказать мне, как это сделать вR, я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 29 августа 2010

Я не уверен, что понимаю, но, кажется, вы хотите переместить NA в конечные столбцы? Вот один из способов (сделано быстро; может быть, более чистый путь):

> d <- data.frame(rbind(c(1, 2, NA, 4, NA, 6), c(NA, 2, 3, 4, 5, 6)))
> d
  X1 X2 X3 X4 X5 X6
1  1  2 NA  4 NA  6
2 NA  2  3  4  5  6
> t(apply(d, 1, function(x) c(x[!is.na(x)], rep(NA, sum(is.na(x))))))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    4    6   NA   NA
[2,]    2    3    4    5    6   NA

По вашим данным:

> t(apply(data, 1, function(x) c(x[!is.na(x)], rep(NA, sum(is.na(x))))))
     [,1]       [,2]       [,3]       [,4]
[1,] "20/02/01" "16/04/01" NA         NA  
[2,] "23/03/02" "03/05/02" "12/02/03" NA  
0 голосов
/ 29 августа 2010

Следуя совету Винса, но, возможно, немного чище:

t(apply(d, 1, function(x) x[order(x)]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...