插入空行以保持R中的索引一致

时间:2014-06-18 08:30:49

标签: r dataframe

假设我在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

即,我想保留行号以匹配第一列中的数字,如果该数字不在我的原始数据集中,我想用第一列填充“NA”。有没有办法在没有循环的R中执行此操作?

谢谢! (并对格式表示道歉......我无法弄清楚如何在不使用编号列表的情况下使列并排显示。)

2 个答案:

答案 0 :(得分:0)

这是一种可行的方法。我在原始data.frame中添加了另一列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条目。

答案 1 :(得分: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到行数的整数序列的列。然后我们向NAs填写不应该具有值的所有位置(即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