2014-06-18 44 views
0

比方說,我有這個表R:插入空行保持一致指數中的R

testTable=data.frame(c(1:5,7:10,12:20)) 

它看起來像這樣(其中1,2,等都是表的行數) :

testTable 

1. 1 
2. 2 
3. 3 
4. 4 
5. 5 
6. 7 
7. 8 
8. 9 
9. 10 
10. 12 
11. 13 
12. 14 
13. 15 
14. 16 
15. 17 
16. 18 
17. 19 
18. 20 

不過,我希望它看起來像這樣:

testTable 

1. 1 
2. 2 
3. 3 
4. 4 
5. 5 
6. NA 
7. 7 
8. 8 
9. 9 
10. 10 
11. NA 
12. 12 
13. 13 
14. 14 
15. 15 
16. 16 
17. 17 
18. 18 
19. 19 
20. 20 

也就是說,我想保持行號在第一科拉姆匹配數n,如果該數字不在我的原始數據集中,我想填寫第一列爲「NA」。有沒有辦法做到這一點在R沒有循環?

謝謝! (並且對格式表示歉意......我無法弄清楚如何使這些列並排顯示,而不使用編號列表。)

回答

0

一堆方法來做到這一點。這是一個。

# dummy data 
d <- data.frame(x=1:20)[sort(sample(20, 15)), , drop=FALSE] 
row.names(d) <- seq_len(nrow(d)) 

d 

#  x 
# 1 1 
# 2 4 
# 3 6 
# 4 7 
# 5 9 
# 6 10 
# 7 11 
# 8 12 
# 9 13 
# 10 14 
# 11 15 
# 12 16 
# 13 17 
# 14 18 
# 15 19 


d2 <- data.frame(x=seq_len(max(d$x))) 
d2$x[setdiff(d2$x, d$x)] <- NA 

我們創建第二data.frame,d2,具有行等於d中觀察到的最大值的數目。這包含一個從1到行數的整數序列。然後我們填入所有不應該有值的位置(即那些在d2$x但不在d$x中的位置)。

不是很優雅,但它完成了工作。

d2 

#  x 
# 1 1 
# 2 NA 
# 3 NA 
# 4 4 
# 5 NA 
# 6 6 
# 7 7 
# 8 NA 
# 9 9 
# 10 10 
# 11 11 
# 12 12 
# 13 13 
# 14 14 
# 15 15 
# 16 16 
# 17 17 
# 18 18 
# 19 19 
0

下面是一個可行的方法。爲了說明,我將另一列sampledata添加到原始數據框中。

require(dplyr) 

testTable <- data.frame(x = c(1:5,7:10,12:20), sampledata = runif(18)) 

new.df <- data.frame(x = sapply(1:20, function(y) ifelse(y %in% testTable$x, y, NA))) 

left_join(new.df, testTable, by="x") 

# x sampledata 
#1 1  0.937 
#2 2  0.657 
#3 3  0.568 
#4 4  0.029 
#5 5  0.094 
#6 NA   NA 
#7 7  0.820 
#8 8  0.111 
#9 9  0.979 
#10 10  0.135 
#11 NA   NA 
#12 12  0.154 
#13 13  0.531 
#14 14  0.897 
#15 15  0.595 
#16 16  0.243 
#17 17  0.370 
#18 18  0.544 
#19 19  0.146 
#20 20  0.793 

有可能更優雅的方式來做到這一點,而無需創建一個新的data.frame。

我使用left_join來自dplyr,因爲它似乎在連接的data.frame中保持順序,而merge似乎將底部的所有NA條目排序。