【问题标题】:R: Is there a way to insert rows that complete a year sequence?R:有没有办法插入完成年份序列的行?
【发布时间】:2023-04-05 21:33:01
【问题描述】:

我正在使用关于个人的纵向数据库(注册数据非常大)研究 R,每个 ID 有几行(在数据库中名为“vn”),它们的属性列在列中。我的变量“观察”表示每年的观察。有时(但并非在所有情况下)跳过一年或多年,因为个人没有任何变化。我想将那些“缺失的行”添加到我的数据库中,以便每个人在他们的第一次和最后一次观察之间每年都有一个条目(这对每个人来说都不一定相同)。由于个人的属性会随时间而变化,因此添加的行必须包含与前一个相同的属性值(对于下面的示例,如果为 2010 年添加一行,则个人在 maritalstatus 中的值为 3,在自治市中的值为 5584) .

这是我数据库中个人的概述:

structure(list(vn = c("555", "555", "555", "555", "555", "555", "555", "555", "555", "555", "555"), municipality = c(5586, 5586, 5586, 5586, 5586, 5586, 5611, 5611, 5584, 5584, 5584), yearofbirth = c(1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957), sex = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), maritalstatus = c(2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3), observation = c(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012)), row.names = 470:480, class = "data.frame")

我当前的代码(如下)在缺少观察年份时向我的数据集添加行,保留前一行的所有信息,除了现在,一些信息加倍,一些观察年份出现两次。

test<-test %>% expand(vn, municipality, yearofbirth, sex, maritalstatus, full_seq(observation,1))

我也在考虑使用rep(),但找不到一种方法来做我想做的事。

有没有人想出一个可以帮助我的代码?

【问题讨论】:

  • 您能否给我们提供dput(head(vn)) 的数据样本,以便其他人可以在他们的系统上重现您的情况?请确保样本中至少有一个观察值缺少行。如果没有,请将n参数添加到head,以确保您获得更大的样本。

标签: r date sequence rows survival-analysis


【解决方案1】:

如果我们每年至少有一次观察,那么这可以通过 tidyr::completetidyr::fill 来实现,如下所示:

编辑 1:如果不是所有年份都存在于数据集中,该方法仍然可以通过首先将 observation 转换为 factor 并将级别设置为年份范围:

编辑 2:要考虑到不同的年份范围,必须在填充后进行过滤。为此,我添加了一个变量 last_obs,其中包含对个人观察到的最后一年。该变量可用于填充后的过滤。

<!-- language-all: lang-r -->


d <- structure(list(vn = c("555", "555", "555", "555", "555", "555", "555", "555", "555", "555", "555"), municipality = c(5586, 5586, 5586, 5586, 5586, 5586, 5611, 5611, 5584, 5584, 5584), yearofbirth = c(1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957), sex = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), maritalstatus = c(2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3), observation = c(2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012)), row.names = 470:480, class = "data.frame")

library(dplyr)
library(tidyr)

# Add some data
d1 <- d %>%
  mutate(vn = "556") %>% 
  filter(observation <= 2010, observation %% 2 == 0)

# Bind data
d2 <- bind_rows(d, d1)

d2 %>%
  # Add year of last obs by vn
  group_by(vn) %>% 
  mutate(last_obs = last(observation)) %>% 
  ungroup() %>% 
  # Convert to fct
  mutate(observation = factor(observation, levels = 2000:2016)) %>%
  # Complete and fill
  tidyr::complete(vn, observation) %>% 
  tidyr::fill(everything()) %>%
  # Convert back to numeric
  mutate(observation = as.integer(as.character(observation))) %>%
  # Drop obs after year of last obs
  filter(as.numeric(observation) <= last_obs) %>% 
  # Drop helper
  select(-last_obs)
#> # A tibble: 22 x 6
#>    vn    observation municipality yearofbirth   sex maritalstatus
#>    <chr>       <int>        <dbl>       <dbl> <dbl>         <dbl>
#>  1 555          2000         5586        1957     2             2
#>  2 555          2001         5586        1957     2             2
#>  3 555          2002         5586        1957     2             3
#>  4 555          2003         5586        1957     2             3
#>  5 555          2004         5586        1957     2             3
#>  6 555          2005         5586        1957     2             3
#>  7 555          2006         5611        1957     2             3
#>  8 555          2007         5611        1957     2             3
#>  9 555          2008         5584        1957     2             3
#> 10 555          2009         5584        1957     2             3
#> # ... with 12 more rows

【讨论】:

  • 嘿,谢谢!但是当我在我的数据库上使用您的代码 (test %&gt;%tidyr::complete(vn, observation) %&gt;% tidyr::fill(everything())) 时,它不会添加任何行。对于我上面给出的概述,它没有添加 2010 年和 2011 年。我认为问题可能是我的变量的结构(最初“vn”在 chr 和“观察”数字中,所以我改变了它们都是数字),但它仍然不起作用。
  • 是的。 tidyr::complete 仅当我们在数据集中至少有一个 obs 时才完成数据集。就像我的示例数据一样。我刚刚进行了编辑以说明数据集中并非所有年份都存在的情况。
  • 它现在可以工作了,非常感谢:-) 但我仍然有一个问题,不是所有的人都必须有从 2000 年到 2012 年的观察结果。有些可能在 2000 年之后开始,有些可能在 2012 年之前或之后结束(而且总观察时间并不相同)。
  • 我添加了另一个编辑以考虑不同的结束年份。基于这种方法,调整代码以考虑不同的开始年份应该是一项容易的任务。只需使用first 而不是last
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多