2010-08-28 109 views
4

下述R代碼的數據幀生成從數據幀我正在與在工作的時刻的代碼段:重新排列中的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,直到行中只剩下NAs。

真正的數據幀由許多行組成,因此手動完成這將意味着辦公室中的很多時間。

如果有人能告訴我如何在R中做到這一點,我將不勝感激!

+0

你能不能更徹底?在數據集中給我們更多的行,所以我們可以看到它是什麼。 – aL3xa 2010-08-28 20:13:22

+0

當然,對於不準確的抱歉!我添加了一些R代碼,生成一個小樣本數據框,看起來像我正在使用的一個。 – 2010-08-28 20:39:08

回答

1

我不確定我是否理解,但似乎您想將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

謝謝文斯,我已經指出了更多的問題,但這正是我所追求的! – 2010-08-28 20:48:39

+1

當應用於向量時,'rbind'返回類'matrix'的對象,所以不需要將其轉換爲'data.frame'以便在其上運行'apply',因爲'apply'將返回'matrix'在'data.frame'上運行時。如果你想對數值進行排序,請嘗試't(apply(data,1,sort,na.last = TRUE))... – aL3xa 2010-08-28 22:11:57

+0

有意使用數據幀,因爲這是OP的問題開始。 – Vince 2010-08-28 22:43:12

0

繼文斯的建議,但也許乾淨了一點:

t(apply(d, 1, function(x) x[order(x)])) 
+1

這將改變原來的順序。但是,如果你不應用(數據,1,函數(x)x [order(is.na(x))]))''那麼應該沒問題。 – Marek 2010-08-30 08:32:03