在R中如何填写未出现在序列中的数字?

问题描述 投票:0回答:2

我有一个数据集,列出了一组分数的百分位数,如下所示:

 > percentiles
    Score Percentile
1     231          0
2     385          1
3     403          2
4     413          3
5     418          4
6     424          5
7     429          6
8     434          7
9     437          8
10    441          9
11    443         10

我希望“得分”列的范围从100到500。也就是说,我希望将100到231的分数与0的百分比相关联,希望将232到385的分数与1的百分比相关联,依此类推。是否有一种简单的方法来填充未出现在“分数”值序列中的值,因此看起来像下面的数据集?

> percentiles
    Score Percentile
1     100          0
2     101          0
3     102          0
4     103          0
5     104          0
6     105          0
7     106          0
8     107          0
9     108          0
10    109          0
--------------------
130   229          0
131   230          0
132   231          0
133   232          1
134   233          1
135   234          1
136   235          1
137   236          1
138   237          1
139   238          1
140   239          1


r seq
2个回答
2
投票

如果将percentiles转换为data.table,则可以对所有得分均为100:500的新表进行滚动连接。滚动联接本身具有填充前移行为,但100:230的值仍为NA,因此最后添加了后向nafill

library(data.table)
setDT(percentiles)

percentiles[data.table(Score = 100:500), on = .(Score), roll = TRUE
            ][, Percentile := nafill(Percentile, 'nocb')]


#      Score Percentile
#   1:   100          0
#   2:   101          0
#   3:   102          0
#   4:   103          0
#   5:   104          0
#  ---                 
# 397:   496         10
# 398:   497         10
# 399:   498         10
# 400:   499         10
# 401:   500         10

1
投票

我们可以使用complete

library(dplyr)
library(tidyr)
out <- complete(percentiles, Score = 100:500) %>%
       fill(Percentile, .direction = "updown")
out %>%
     slice(c(1:10, 130:140)) %>% 
     as.data.frame
#   Score Percentile
#1    100          0
#2    101          0
#3    102          0
#4    103          0
#5    104          0
#6    105          0
#7    106          0
#8    107          0
#9    108          0
#10   109          0
#11   229          0
#12   230          0
#13   231          0
#14   232          1
#15   233          1
#16   234          1
#17   235          1
#18   236          1
#19   237          1
#20   238          1
#21   239          1

数据

percentiles <- structure(list(Score = c(231L, 385L, 403L, 413L, 418L, 424L, 
429L, 434L, 437L, 441L, 443L), Percentile = 0:10), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11"))
© www.soinside.com 2019 - 2024. All rights reserved.