为缺少的数据添加指定的行

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

我想为指定的图,时间和日期插入'NA'值,它们是随机放置的。我想出了如何使用add_row函数手动进行操作,但是对我来说,主要的问题是我有大量数据,而手动进行操作无济于事。我的数据是这种格式。

Plot Date Time Canopyheight
B1 10/22/2019 22 50
B1 10/22/2019 1 80
B1 10/22/2019 4 9

所以在每个图中,我有4个时间戳,分别为22、1、4和6,有时会缺少时间戳,例如B1 10/22/2019 6 Na。我可以使用下面的代码添加这些行

  add_row(agg, Date = '10/21/2019', Plot = 'BG107B2', Time = 22,
          Canopyheight = NA, .before = 1)

但是我有几个日期和图表需要在其中添加行。我已经尝试过以下代码

test <- agg %>%
  mutate(ID2 = as.integer(factor(Plot, levels = unique(.$Plot)))) %>%
  split(f = .$ID2) %>%
  map_if(.p = function(x) unique(x$ID2) != unique(last(.)$ID2),
         ~bind_rows(.x, tibble(Time = unique(.x$Time), Canopyheight = NA,
                               ID2 = unique(.x$ID2)))) %>%
  bind_rows() %>%
  select(-ID2)

但是,我仍然无法做到这一点,有什么方法可以使它自动化而不是手动方法?

谢谢,祝你有美好的一天。

r bind tibble
2个回答
0
投票

一种方法实际上是对预期的日期/时间组合进行完全连接。这自然会将NA引入其余的列中。例如:

library(dplyr)
library(tidyr)
agg <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Plot Date Time Canopyheight
B1 10/22/2019 22 50
B1 10/22/2019 1 80
B1 10/22/2019 4 9")
distinct(agg, Plot, Date) %>%
  crossing(Time = c(22L, 1L, 4L, 6L)) %>%
  full_join(agg, ., by = c("Plot", "Date", "Time"))
#   Plot       Date Time Canopyheight
# 1   B1 10/22/2019   22           50
# 2   B1 10/22/2019    1           80
# 3   B1 10/22/2019    4            9
# 4   B1 10/22/2019    6           NA

[管道的前两行仅提供您希望包括时间的所有日期,然后我们将tidyr::crossing的所有组合与Time组合在一起强制使用Plot,Date

distinct(agg, Plot, Date) %>%
  crossing(Time = c(22L, 1L, 4L, 6L))
# # A tibble: 4 x 3
#   Plot  Date        Time
#   <chr> <chr>      <int>
# 1 B1    10/22/2019     1
# 2 B1    10/22/2019     4
# 3 B1    10/22/2019     6
# 4 B1    10/22/2019    22

joinmerge的数据集如果您以前从未做过,可能会很不直观,我建议在其他地方阅读有关它们的更多信息。如果您要使用SQL数据库,那么在我看来,它变得更加关键。下面是一些有价值的参考(关于R并非全部,但概念仍然相关):


0
投票

我们可以使用complete中的tidyr

tidyr::complete(df, Plot, Date, Time = c(22, 1, 4, 6))

#  Plot  Date        Time Canopyheight
#  <fct> <fct>      <dbl>        <int>
#1 B1    10/22/2019     1           80
#2 B1    10/22/2019     4            9
#3 B1    10/22/2019     6           NA
#4 B1    10/22/2019    22           50
#5 B2    10/22/2019     1           NA
#6 B2    10/22/2019     4            9
#7 B2    10/22/2019     6           80
#8 B2    10/22/2019    22           50

数据

包括另外一组Plot用于测试

df <- structure(list(Plot = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("B1", 
"B2"), class = "factor"), Date = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = "10/22/2019", class = "factor"), Time = c(22L, 
1L, 4L, 22L, 6L, 4L), Canopyheight = c(50L, 80L, 9L, 50L, 80L, 
9L)), class = "data.frame", row.names = c(NA, -6L))
© www.soinside.com 2019 - 2024. All rights reserved.