假设我在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中执行此操作?
谢谢! (并对格式表示道歉......我无法弄清楚如何在不使用编号列表的情况下使列并排显示。)
答案 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