【问题标题】:How can I create new columns, based on the numeric value of another column如何根据另一列的数值创建新列
【发布时间】:2021-03-30 03:37:55
【问题描述】:

我有一个有 1000 多名参与者的 df (chpt4),以及参加考试的日期。我想根据跟进 (t1:t4) 和基线 (t0) 之间经过的月数来调整日期。为此,我创建了 4 个额外的列 (difft0t2:difft0t4),它们准确地显示了测试之间经过的月份。图片就是我现在的样子。

我将月份分为 5 个不同的类别:(我也认为这个向量可以帮助我作为计数器)

FU6 <- 1:9
FU12 <- 10:18 
FU24 <- 19:30
FU36 <- 31:42
FU48 <- 43:54

我最初的想法是使用 which() 开始索引属于上述范围的 difft0t1 列的值

which(chpt4$difft0t1 %in% c(FU6)) #this works

which(chpt4$difft0t1 %in% c(FU14)) #this doesn't work at all 

...并使用该结果编号作为要粘贴到另一列的元素的索引。它只是不起作用。

与第 243 和 244 行中的图像示例保持一致,我希望输出列看起来像这样:

baseline FU6 FU12 FU24 FU36 FU48
2012-02-24 NA 2013-09-06 2014-02-21 2015-06-23 NA
2012-05-24 NA 2013-05-16 NA 2015-04-20 2016-05-12

【问题讨论】:

  • 我不清楚这个问题,特别是 FU 整数序列如何与所需的 FU 日期相关,以及您的 which 代码如何与所需的 FU 日期相关。为了清楚起见,考虑重新起草帖子。并且FU14 没有在帖子中定义。最后,请dput 数据样本,不要使用图像。见why
  • 请让那些试图帮助你的人更容易。不要将数据/代码添加为图像。提供一个可重现的示例以及预期的输出。阅读how to give a reproducible example
  • 如果同一个FU 组中有两个或多个测试怎么办?例如说 T1 和 T2 是否在 FU24 中(距离 T0 19 到 30 个月)对于任何 id?

标签: r loops indexing columnsorting


【解决方案1】:

我认为你需要这个

library (tidyverse)
df %>% pivot_longer(cols = -id, names_to = "Test", values_to = "Dates") %>%
  group_by(id) %>% mutate(new_col = as.numeric(round((Dates - first(Dates))/30,0))) %>%
  mutate(new_col = case_when(new_col == 0 ~ "Baseline",
                              new_col %in% 1:9 ~ "FU6",
                              new_col %in% 10:18 ~ "FU12",
                              new_col %in% 19:30 ~ "FU24",
                              new_col %in% 31:42 ~ "FU36",
                              new_col %in% 43:54 ~ "FU48")) %>% filter(!is.na(new_col)) %>%
  select(-Test) %>% pivot_wider(id_cols = "id", names_from = "new_col", values_from = "Dates", values_fn = min)
  
# A tibble: 4 x 6
# Groups:   id [4]
  id     Baseline   FU12       FU24       FU36       FU48      
  <chr>  <date>     <date>     <date>     <date>     <date>    
1 waa000 2012-10-04 2013-09-05 NA         NA         NA        
2 waf84  2012-02-24 NA         2013-09-06 2015-06-23 NA        
3 waq593 2012-05-24 2013-05-16 NA         2015-04-20 2016-05-12
4 wcu776 2013-01-24 2014-01-23 NA         NA         NA       

注意 当一个组中有两个日期时,将显示其中的最小值/第一个。一旦使用了适当的数据,FU6 类别将自动出现在图片中。 使用的样本数据

dput(df)

> dput(df)
structure(list(id = c("waa000", "waf84", "waq593", "wcu776"), 
    t0 = structure(c(15617, 15394, 15484, 15729), class = "Date"), 
    t1 = structure(c(15953, 15954, 15841, 16093), class = "Date"), 
    t2 = structure(c(NA, 16122, 16545, NA), class = "Date"), 
    t3 = structure(c(NA, 16609, 16933, NA), class = "Date"), 
    t4 = structure(c(NA_real_, NA_real_, NA_real_, NA_real_), class = "Date")), row.names = c(NA, 
-4L), class = "data.frame")

> df
      id         t0         t1         t2         t3   t4
1 waa000 2012-10-04 2013-09-05       <NA>       <NA> <NA>
2  waf84 2012-02-24 2013-09-06 2014-02-21 2015-06-23 <NA>
3 waq593 2012-05-24 2013-05-16 2015-04-20 2016-05-12 <NA>
4 wcu776 2013-01-24 2014-01-23       <NA>       <NA> <NA>

【讨论】:

  • 嗨@anilgoyal,这是一个非常好的答案。我昨天发布了一个类似的问题,我想你可能会有答案:) 我希望你在删除之前看到这条消息
  • 好的。让我看看并弄清楚一些事情
猜你喜欢
  • 2021-12-02
  • 2020-04-16
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2022-01-20
  • 2020-04-28
相关资源
最近更新 更多