【问题标题】:Creating wide data that has only 1 ID column [duplicate]创建只有 1 个 ID 列的宽数据 [重复]
【发布时间】:2019-09-13 07:22:47
【问题描述】:

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

  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

【问题讨论】:

  • 请将您的预期输出的示例数据框添加到您的问题中。
  • 可能不清楚这是我将编辑的第二个数据框

标签: r tidyr reshape2


【解决方案1】:

您可以使用基础 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))

【讨论】:

  • 这不会创建有 1 个 ID 而其他所有内容都在同一行的宽数据格式。
  • 查看我的答案的编辑。
【解决方案2】:

这是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 列分成两列,无论date偶数 还是奇数。这是使用模 (%%) 运算符(以及一些额外的数字运算)完成的。 date.1 = date %% 2 * date 捕获日期中的奇数,其他所有的都是 0date.2 = - (date %% 2 - 1) * date 捕获偶数并且是 0 对于所有其他人。

然后很简单:选择除date 之外的所有列;将其扩展为宽格式,再次有点棘手,通过ID 进行汇总并删除所有NAs (group_by(ID) %&gt;% summarise_all(list(~ sum(.[!is.na(.)])))

【讨论】:

  • 我收到此错误 UseMethod("tbl_vars") 中的错误:当我运行它时,没有适用于 'tbl_vars' 的方法应用于类“list”的对象。你知道这是什么吗?
  • @DillonLloyd:不知道。它在这里工作..我重新格式化了代码,也许是因为+ 登录它..它现在工作了吗?
  • 是的,但是,我不完全理解您在 mutate 语句中所做的事情
  • @DillonLloyd:我做了一些解释的编辑。
猜你喜欢
  • 2021-01-03
  • 2013-11-16
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2018-08-08
相关资源
最近更新 更多