【问题标题】:reindex and padding R dataframe重新索引和填充 R 数据帧
【发布时间】:2017-05-17 18:29:46
【问题描述】:

我有一个看起来像这样的 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

基本上,当在第一个 obs 之前有缺失数据时向后填充,当缺失数据介于两者之间时向前填充。 我所做的是按猫分组

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

A  8
B  6

但现在我被困在接下来的步骤中。

【问题讨论】:

  • 你可以使用complete(df1, v1, v2) from library(tidyr)
  • 对不起,我编辑是因为我错过了有关填充的部分,但感谢您的回答
  • 可能你提到的包的填充功能正是我要找的

标签: r dataframe data-manipulation


【解决方案1】:

我们可以试试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))

【讨论】:

  • 太棒了...我希望我能分配更多积分。非常有帮助。
  • 再问一个问题:如果我想填充更多列,我应该如何处理另一列?让我们假设应用您的第一个见解。我已经尝试过link 中使用的方法(第二个,定义一个列表),但对我不起作用。我没有得到任何填充的结果列。
  • @user7370159 您能否将其作为一个新问题发布,因为不清楚您是否正在创建新列?
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多