该数据有两列。一个有参与者ID,第二个有日期。我想将日期转换为列,在每一列中,我想要该ID的确切日期。例如,t1 3月至2020年5月,t2 6月至9月,t3 10月至12月,t4 1月至2021年2月,t5 3月至2021年6月。这是一个虚拟代码,在我的真实数据,我有ID作为字符变量,而不是数字,如桶-01。假设木桶-01在不同的日期重复了六次,所以我希望t1列有属于其范围的特定内容,以此类推。
n <- 6 #in actual data frequencies range from 2-8 or IDs are repeated 2-8 times rather than a fixed number
df <- data.frame(id=rep(1:500, each=n),
date=sample(seq(as.Date('2020/03/01'), as.Date('2021/07/30'), by="day"), 12))以下是我真实数据的结构:
str(df)
tibble [4,347 × 2] (S3: tbl_df/tbl/data.frame)
$ id : chr [1:4347] "CI-001" "CI-002" "CI-003" "CI-004" ...
$ sampledate: POSIXct[1:4347], format: "2020-03-06" "2020-03-06" "2020-03-06" "2020-03-06" ...我试图找到相关的代码,但至今没有找到。我可以在excel中手动完成,事实上,我已经做了排序,然后复制粘贴确切的日期,但是我想在R中做,你觉得呢?我也发了一张假的结果图片。基本上,第一列将是参与者id,接下来的五列是时间列,即具有日期范围的t1-5列。t1 3月至2020年5月,t2 6月至9月,t3 10月至12月,t4 1月至2021年2月,t5 3月至2021年6月。因此,链接到每个参与者ID的日期将进入相应的时间列t1-5。例如,如果cas-03有日期:2021年2月5日(它将出现在t4列中),以及2020年3月7日和9日(都在t1中,但在两行)。目前,每个ID作为新链接日期的行重复,但只有在时间列日期范围中存在多个链接日期的情况下,新表才会在行中重复ID。在R.做得太复杂了吗?

最近,我尝试了这段代码,但它说:错误的过滤器(.,id <= 3):对象'id‘没有找到,此外:警告消息:在data.matrix(数据):NAs引入强制
# change to your df to have different rep per IDs
df <- df %>%
filter(id <= 3) %>%
mutate(id = ifelse(id == 3, 2, id))
df <- df %>%
group_by(id) %>%
mutate(t = paste0("t", row_number())) %>%
arrange(t) %>%
ungroup()
df %>%
pivot_wider(names_from = t, values_from = date) %>%
head()发布于 2021-06-22 15:29:01
假设每个ID的观测数量完全相同(因为df %>% group_by(id) %>% summarise(count = n()) %>% pull(count) %>% unique() = 6),那么我建议您使用tidyr包,如下所示:
library(tidyr)
n <- 6
df <- data.frame(id=rep(1:500, each=n),
date=sample(seq(as.Date('2020/03/01'), as.Date('2021/07/30'), by="day"), 12))
df %>% group_by(id) %>% summarise(count = n()) %>% pull(count) %>% unique()
df <- df %>%
group_by(id) %>%
mutate(t = paste0("t", row_number())) %>%
arrange(t)
df %>%
pivot_wider(names_from = t, values_from = date)看看这里:https://tidyr.tidyverse.org/articles/pivot.html
编辑到您的评论
如果每个ID没有相同的重复次数,那就没什么大不了的了。pivot_wider()很聪明,它将在输出中添加NA值,例如:
# change to your df to have different rep per IDs
df <- df %>%
filter(id <= 3) %>%
mutate(id = ifelse(id == 3, 2, id))
df <- df %>%
group_by(id) %>%
mutate(t = paste0("t", row_number())) %>%
arrange(t) %>%
ungroup()
df %>%
pivot_wider(names_from = t, values_from = date) %>%
head()会回来
# A tibble: 2 x 13
id t1 t10 t11 t12 t2 t3 t4 t5 t6 t7 t8
<dbl> <date> <date> <date> <date> <date> <date> <date> <date> <date> <date> <date>
1 1 2021-04-06 NA NA NA 2020-10-16 2020-03-17 2021-03-20 2020-11-04 2021-03-22 NA NA
2 2 2021-07-26 2021-03-20 2020-11-04 2021-03-22 2021-07-02 2020-03-09 2020-05-13 2021-04-23 2020-04-09 2021-04-06 2020-10-16
# ... with 1 more variable: t9 <date>https://stackoverflow.com/questions/68086294
复制相似问题