首页 > 解决方案 > R中有没有办法将组内的各种项目转换为多列?

问题描述

假设我有一个这样的数据框:

 df<-data.frame(group=c(1, 1, 1, 1, 1,1, 2, 2, 2,2,2,2, 3,3,3,3,3,3),
               date=c("2000-01-01", "2000-01-02", "2000-01-01", "2000-01-02", "2000-01-01", "2000-01-01",
                      "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-03", "2000-01-04", "2000-01-05",
                      "2000-01-06", "2000-01-06", "2000-01-02", "2000-01-05", "2000-01-02", "2000-01-03"))

我基本上有另一个时间变量,我想与每个“组”进行比较,如果我在一行中有一个组中的所有日期,我应该能够(即如果“时间”小于 want_1 | want_2 ... 等等。所以是这样的:

   group       date     want_1     want_2     want_3     want_4
1      1 2000-01-01 2000-01-01 2000-01-02       <NA>       <NA>
2      1 2000-01-02 2000-01-01 2000-01-02       <NA>       <NA>
3      1 2000-01-01 2000-01-01 2000-01-02       <NA>       <NA>
4      1 2000-01-02 2000-01-01 2000-01-02       <NA>       <NA>
5      1 2000-01-01 2000-01-01 2000-01-02       <NA>       <NA>
6      1 2000-01-01 2000-01-01 2000-01-02       <NA>       <NA>
7      2 2000-01-03 2000-01-03 2000-01-04 2000-01-05       <NA>
8      2 2000-01-04 2000-01-03 2000-01-04 2000-01-05       <NA>
9      2 2000-01-05 2000-01-03 2000-01-04 2000-01-05       <NA>
10     2 2000-01-03 2000-01-03 2000-01-04 2000-01-05       <NA>
11     2 2000-01-04 2000-01-03 2000-01-04 2000-01-05       <NA>
12     2 2000-01-05 2000-01-03 2000-01-04 2000-01-05       <NA>
13     3 2000-01-06 2000-01-06 2000-01-02 2000-01-05 2000-01-03
14     3 2000-01-06 2000-01-06 2000-01-02 2000-01-05 2000-01-03
15     3 2000-01-02 2000-01-06 2000-01-02 2000-01-05 2000-01-03
16     3 2000-01-05 2000-01-06 2000-01-02 2000-01-05 2000-01-03
17     3 2000-01-02 2000-01-06 2000-01-02 2000-01-05 2000-01-03
18     3 2000-01-03 2000-01-06 2000-01-02 2000-01-05 2000-01-03


请注意,组中的每个日期都填充了一个新列。

也欢迎其他建议,谢谢!

标签: r

解决方案


所以我创建date_a

date_a <- c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04")
date_a <- data.frame(want = c("want_1", "want_2", "want_3", "want_4"),date_a = as.Date(date_a))

crossing(df,date_a) %>% 
mutate(flg = as.numeric(date < date_a)) %>% 
select(-date_a) %>% 
distinct() %>% 
spread(want,flg)

现在,您的数据的缺点是您有多余的行,并且该distinct功能将消除原始数据中的重复行。


推荐阅读