【问题标题】:Fill in missing rows in R填补R中缺失的行
【发布时间】:2015-08-27 10:41:40
【问题描述】:

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

ID  A   B   C   D   Month
1   X   M   5   1   3
1   X   K   4   2   4
1   X   K   3   7   5
1   X   K   2   6   6
2   Y   L   5   8   1
2   Y   L   2   3   2
2   Y   M   5   1   3
2   Y   K   2   7   5
2   Y   M   2   8   6
3   Z   K   5   3   1
3   Z   M   6   3   2
3   Z   M   5   8   3
3   Z   K   4   2   4
  • 在此数据中IDA 是唯一变量,
  • B,C,D,Month 可以改变它们的值
  • Month 具有从 1 到 6 的 6 因子值
  • B 具有来自 K、L、M 的 3 因子值
  • C,D 可以有任何值。

我希望这些数据变成这样

ID  A   B   C   D   Month
1   X   0   0   0   1
1   X   0   0   0   2
1   X   M   5   1   3
1   X   K   4   2   4
1   X   K   3   7   5
1   X   K   2   6   6
2   Y   L   5   8   1
2   Y   L   2   3   2
2   Y   M   5   1   3
2   Y   0   0   0   4
2   Y   K   2   7   5
2   Y   M   2   8   6
3   Z   K   5   3   1
3   Z   M   6   3   2
3   Z   M   5   8   3
3   Z   K   4   2   4
3   Z   0   0   0   5
3   Z   0   0   0   6

它应该通过保持唯一变量值相同并用零填充不同的值来填充缺失的行。

我可以使用zoo库来填充缺失的值,但是如何填写完整的缺失行?

【问题讨论】:

  • 也许看看expand.grid(或来自“data.table”的CJ)。

标签: r


【解决方案1】:

也许这样的东西可以满足您的需求:

library(dplyr)

mydf %>%
  full_join(expand.grid(ID = unique(mydf$ID), Month = 1:6)) %>%
  group_by(ID) %>%
  mutate(A = replace(A, is.na(A), unique(na.omit(A)))) %>%
  arrange(ID, A, Month) %>%
  replace(., is.na(.), 0)
# Joining by: c("ID", "Month")
# Source: local data frame [18 x 6]
# Groups: ID
# 
#    ID A B C D Month
# 1   1 X 0 0 0     1
# 2   1 X 0 0 0     2
# 3   1 X M 5 1     3
# 4   1 X K 4 2     4
# 5   1 X K 3 7     5
# 6   1 X K 2 6     6
# 7   2 Y L 5 8     1
# 8   2 Y L 2 3     2
# 9   2 Y M 5 1     3
# 10  2 Y 0 0 0     4
# 11  2 Y K 2 7     5
# 12  2 Y M 2 8     6
# 13  3 Z K 5 3     1
# 14  3 Z M 6 3     2
# 15  3 Z M 5 8     3
# 16  3 Z K 4 2     4
# 17  3 Z 0 0 0     5
# 18  3 Z 0 0 0     6

【讨论】:

  • 我使用了你的方法,它似乎有效。我有一个问题,如何将数据保存到另一个数据框。我尝试使用 df2=mydf%>%... 但它也保存了很多其他的东西,比如属性细节。如何将 20 列数据保存到新数据框中?谢谢
【解决方案2】:

这是使用base R的一种方式

frame <- expand.grid(ID = unique(dat$ID), Month = 1:6)
dat2 <- merge(dat, frame, by=c("ID", "Month"), all=TRUE)[, union(names(dat), names(frame))]
levels(dat2$B) <- c(levels(dat2$B), 0)

res <- lapply(split(dat2, dat2$ID), function(x) {
  x$A[which(is.na(x$A))] <- unique(x$A)[!is.na(unique(x$A))]
  x[is.na(x)] <- 0
  x
})

do.call(rbind, res)
     ID A B C D Month
1.1   1 X 0 0 0     1
1.2   1 X 0 0 0     2
1.3   1 X M 5 1     3
1.4   1 X K 4 2     4
1.5   1 X K 3 7     5
1.6   1 X K 2 6     6
2.7   2 Y L 5 8     1
2.8   2 Y L 2 3     2
2.9   2 Y M 5 1     3
2.10  2 Y 0 0 0     4
2.11  2 Y K 2 7     5
2.12  2 Y M 2 8     6
3.13  3 Z K 5 3     1
3.14  3 Z M 6 3     2
3.15  3 Z M 5 8     3
3.16  3 Z K 4 2     4
3.17  3 Z 0 0 0     5
3.18  3 Z 0 0 0     6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多