reindex和padding R dataframe

时间:2017-01-03 15:53:25

标签: r dataframe data-manipulation

我有一个看起来像这样的R数据框

1  A   1
2  A   0.9
5  A   0.7
6  A   0.6
8  A   0.5
3  B   0.6
4  B   0.5
5  B   0.4
6  B   0.3

我需要填补所有空白,直到每个类别的最大值(第二列)。 即我希望获得的结果如下

1  A  1
2  A  0.9
3  A  0.9
4  A  0.9
5  A  0.7
6  A  0.6
7  A  0.6
8  A  0.5
1  B  0.6
2  B  0.6
3  B  0.6
4  B  0.5
5  B  0.4
6  B  0.3

基本上,当第一个障碍物之前缺少数据时向后填充,当缺失数据介于两者之间时向前填充。 我所做的是用猫分组

 groupby = ddply(df, ~fit$group,summarise, max=max(time))

A  8
B  6

但现在我仍然坚持下一步。

2 个答案:

答案 0 :(得分:2)

我们可以尝试使用data.table/zoo。将'data.frame'转换为'data.table'(setDT(df1)),根据按{v2'分组的max值序列展开'v1'列,加入on使用'v1'和'v2'然后按'v2'分组,我们使用na.locf(来自zoo

将NA元素与相邻元素填充在一起
library(data.table)
library(zoo)
setDT(df1)[df1[, .(v1=seq_len(max(v1))), v2], on = c('v1', 'v2')
  ][, v3 := na.locf(na.locf(v3, na.rm = FALSE), fromLast=TRUE), by = v2][]
#     v1 v2  v3
# 1:  1  A 1.0
# 2:  2  A 0.9
# 3:  3  A 0.9
# 4:  4  A 0.9
# 5:  5  A 0.7
# 6:  6  A 0.6
# 7:  7  A 0.6
# 8:  8  A 0.5
# 9:  1  B 0.6
#10:  2  B 0.6
#11:  3  B 0.6
#12:  4  B 0.5
#13:  5  B 0.4
#14:  6  B 0.3

或使用dplyr/zoo

library(dplyr)
library(zoo)
library(tidyr)
df1 %>%
    group_by(v2) %>% 
    expand(v1 = seq_len(max(v1))) %>%
    left_join(., df1) %>%
    mutate(v3 =  na.locf(na.locf(v3, na.rm = FALSE), fromLast=TRUE)) %>%
    select(v1, v2, v3)
#    v1    v2    v3
#   <int> <chr> <dbl>
#1      1     A   1.0
#2      2     A   0.9
#3      3     A   0.9
#4      4     A   0.9
#5      5     A   0.7
#6      6     A   0.6
#7      7     A   0.6
#8      8     A   0.5
#9      1     B   0.6
#10     2     B   0.6
#11     3     B   0.6
#12     4     B   0.5
#13     5     B   0.4
#14     6     B   0.3

数据

df1 <- structure(list(v1 = c(1L, 2L, 5L, 6L, 8L, 3L, 4L, 5L, 6L), v2 = c("A", 
"A", "A", "A", "A", "B", "B", "B", "B"), v3 = c(1, 0.9, 0.7, 
0.6, 0.5, 0.6, 0.5, 0.4, 0.3)), .Names = c("v1", "v2", "v3"),
 class = "data.frame", row.names = c(NA, -9L))

答案 1 :(得分:1)

library(dplyr)
library(tidyr)
library(zoo)
complete(dat, V2, V1) %>% mutate(V3 = na.locf(V3))

结果:

# A tibble: 14 × 3
       V2    V1    V3
   <fctr> <int> <dbl>
1       A     1   1.0
2       A     2   0.9
3       A     3   0.9
4       A     4   0.9
5       A     5   0.7
6       A     6   0.6
7       A     8   0.5
8       B     1   0.5
9       B     2   0.5
10      B     3   0.6
11      B     4   0.5
12      B     5   0.4
13      B     6   0.3
14      B     8   0.3