如何将数据转换为非等列?

2024-02-11

我有一个事件数据集,按以下分组let像这样:

set.seed(3)
events <- data.frame(
  let = rep(LETTERS[1:2], each=3),
  age = c(0,sample(1:20, size=2),
          0,sample(1:20, size=2)),
  value = sample(1:100, size=6))

  let age value
1   A   0    61
2   A   4    60
3   A  16    13
4   B   0    29
5   B   8    56
6   B   7    99

如何转换数据框,以便年龄是分组为周的多列?因此对于每一列,取小于或等于0、7、14、21天的最大年龄的值。

events.cast <- data.frame(
  let = LETTERS[1:2],
  T0_value = c(61,29),
  T1_value = c(60,99),
  T2_value = c(60,56),
  T3_value = c(13,56))

 let T0_value T1_value T2_value T3_value
1   A       61       60       60       13
2   B       29       99       56       56

一种选择是cut将“年龄”放入桶中,得到max按该组行并“让”,然后重新整形为“宽”格式

library(dplyr)
library(tidyr)
library(stringr)
events %>%
  group_by(grp = cut(age, breaks = c(-Inf,0, 7, 14, 21),
        labels = str_c("T", 0:3, "_value")), let) %>% 
  slice(which.max(value)) %>% 
  ungroup %>%
  select(-age) %>% 
  group_by(let) %>%
  complete(grp = unique(.$grp)) %>%
  fill(value) %>% 
  pivot_wider(names_from = grp, values_from = value)
# A tibble: 2 x 5
# Groups:   let [2]
#  let   T0_value T1_value T2_value T3_value
#  <chr>    <int>    <int>    <int>    <int>
#1 A           61       60       60       13
#2 B           29       99       56       56

data

events <- structure(list(let = c("A", "A", "A", "B", "B", "B"), age = c(0L, 
4L, 16L, 0L, 8L, 7L), value = c(61L, 60L, 13L, 29L, 56L, 99L)),
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据转换为非等列? 的相关文章

随机推荐