创建只有 1 个 ID 列的宽数据

Creating wide data that has only 1 ID column

我有一个如下所示的数据框:

  ID Code_Type Code date 
   1   10        4    1
   1    9        5    2
   2    10       6    3
   2    9        7    4

我希望它看起来像这样:

  ID date.1 date.2  9  10
   1   1        2   5  4
   2   3        4   7  6

不同的日期在同一行中有不同的列。

我目前的代码是这样的:

#Example df
df <- data.frame("ID" = c(1,1,2,2), 
                 "Code_Type" = c(10,9,10,9), 
                 "Code" = c(4,5,6,7),
                 "date"= c(1,2,3,4))

spread(df, Code_Type,Code)

这输出:

  ID date   9  10
   1   1    NA  4
   1   2    5  NA
   2   3    NA  6
   2   4    7  NA

这和我想要的相似我只是不知道如何将日期列变成多列。感谢任何帮助或额外阅读。

澄清一下这是我预期的输出数据框

  ID date.1 date.2  9  10
   1   1        2   5  4
   2   3        4   7  6

这是一个 dplyr / tidyr 替代方案:

df %>% mutate(date.1 = date %% 2 * date) %>% mutate(date.2 = - (date %% 2 - 1) * date) %>% select(-date) %>% spread(Code_Type, Code) %>% group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))

# A tibble: 2 x 5
     ID date.1 date.2   `9`  `10`
  <dbl>  <dbl>  <dbl> <dbl> <dbl>
1     1      1      2     5     4
2     2      3      4     7     6

想法是将 date 列拆分为两列,无论 dateeven 还是 odd .这是使用模 (%%) 运算符(以及一些额外的数字运算)完成的。 date.1 = date %% 2 * date 捕获日期中的奇数,并且 0 用于所有其他; date.2 = - (date %% 2 - 1) * date 捕捉偶数,0 捕捉所有其他数字。

之后就很简单了:select 除 date 之外的所有列;将它传播到宽格式,再次有点棘手,通过 ID 总结并删除所有 NAs (group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)]))).

您可以使用基础 R 中的 reshape

reshape(dat, idvar=c("ID"), timevar="Code_Type", direction="wide")
#   ID Code.10 date.10 Code.9 date.9
# 1  1       4       1      5      2
# 3  2       6       3      7      4

数据

dat <- structure(list(ID = c(1, 1, 2, 2), Code_Type = c(10, 9, 10, 9
), Code = c(4, 5, 6, 7), date = c(1, 2, 3, 4)), class = "data.frame", row.names = c(NA, 
-4L))