R语言 在数据框中为每个观测添加线

wnvonmuf  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(127)

我有一个长格式的数据结构,这意味着每个人都有多个观察结果(每个观测值都有一行)。现在每个个体都有不同数量的观测值。我希望以这样的方式来组织我的数据,即每个个体都将有相同数量的观测值。因此,找到具有最多观察值的个体并使用LOCF添加行(取决于缺失行的数量)将是很棒的。
例如:

# simulate data structure
d <- data.frame(
  id = c(1,1,1,2,2,3,3,3,3,3),
  value = c(10,11,12,5,9,55,14,12,20,7) )

现在,个体3具有最多的观测值(计数= 5)。我想为个体1添加两行(值为12),为个体2添加三行(值为9)
有什么想法吗?
祝您愉快,谢谢您。

1aaf6o9v

1aaf6o9v1#

如果您希望结转每个人的最后一个值,您可以

d$seq=ave(d$id,d$id,FUN=seq_along)
d=merge(
  d,
  merge(
    aggregate(value~id,data=d,FUN=tail,1),
    data.frame("seq"=1:max(table(d$id))),
    how="cross"
  ),
  by=c("id","seq"),
  all.y=T
)
d$value=ifelse(is.na(d$value.x),d$value.y,d$value.x)
d=d[,!grepl("value.",colnames(d))]

   id seq value
1   1   1    10
2   1   2    11
3   1   3    12
4   1   4    12
5   1   5    12
6   2   1     5
7   2   2     9
8   2   3     9
9   2   4     9
10  2   5     9
11  3   1    55
12  3   2    14
13  3   3    12
14  3   4    20
15  3   5     7
omqzjyyz

omqzjyyz2#

这里有一个tidyverse的解决方案,如果我们用seq_along创建一个变量来保存ID内的计数,那么我们可以用completefill来扩展表并填充缺失的值。

d |> group_by(id) |> 
     mutate(n = seq_along(value)) |>
     ungroup() |>
     complete(id, n) |>
     fill(value) |> 
     select(-n)

# A tibble: 15 × 2
      id value
   <dbl> <dbl>
 1     1    10
 2     1    11
 3     1    12
 4     1    12
 5     1    12
 6     2     5
 7     2     9
 8     2     9
 9     2     9
10     2     9
11     3    55
12     3    14
13     3    12
14     3    20
15     3     7

相关问题