【问题标题】:Creating multiple data frames using same pipes but different columns in R在 R 中使用相同的管道但不同的列创建多个数据框
【发布时间】:2021-06-11 06:01:49
【问题描述】:

我有一个数据集,我想为每个日期执行年龄和性别计数,然后创建一个新的数据框以在之后连接在一起。工作流程是这样的:

age_count <- master %>%
  count(Age, Date) %>%
  pivot_wider(names_from = Age, values_from = n, values_fill = 0)%>%
  arrange(Date) 

数据框master 包含其他信息,例如其他列中的性别。 Date 列也不是唯一的,所以 add_count() 不起作用。现在,我通过更改列名(例如 Age 变为 Gender)来重复每个列的代码以提出这些枢轴,但我想知道是否可以通过使用重复类似代码来做到这一点一个循环,以防我想为master 数据框中的更多列做更多相同的枢轴?我主要是对新的 df 分配有问题。

主数据框的 sn-p 如下所示:

Date <- c("5/21","5/21","5/22","5/22","5/24","5/24","5/24")
Age <- c("70","80","70","70","60","40","40")
Gender <- c("M","M","F","M","F","M","M")
master <- data.frame(Date,Age,Gender)

【问题讨论】:

  • 您可以将代码包装在一个函数中,然后将其应用于多个列。如果您需要帮助,请分享一些示例数据来测试代码,例如dput(master[1:5, c("Date", "Age", "Gender")] 将为这三列提供前 5 行的复制/可粘贴版本——调整子集以确保它说明了问题。
  • 刚刚为主数据框添加了一个小例子。我肯定会感谢一些帮助,因为我不是很精通。谢谢!
  • 你想要得到的输出究竟是什么?
  • age_count 的输出应该是第一列“日期”,然后是许多唯一的“年龄”列(例如,在示例主表中将有 4:40、60、70 和 80 .) “日期”列将是唯一的,因此每一行都是一个包含每个年龄组统计的日期。我对 Gender 和其他参数(未在此示例主 df 中显示)做同样的事情 - 一旦我得到这些,我会调用 bind_cols() 来创建一个新的 df,基本上是我指定的每个类别的每个日期的计数

标签: r dplyr tidyverse


【解决方案1】:

这是一种方法,它将对purrr::map_dfc 的调用嵌套在dplyr::across 中。它应该适用于所有变量,但我们需要先将它们转换为因子。

library(tidyverse)

master %>% 
  mutate(across(!Date, as.factor)) %>% 
  group_by(Date) %>% 
  summarise(across(everything(), # uses all variables, expect Date bc its the grouping var
                   ~ map_df(set_names(unique(.x)),
                    function(y) {
                      sum(y == .x, na.rm = TRUE)
                    }))
            ) %>%
  do.call("data.frame", args = .) %>% 
  replace(is.na(.), 0)

#>   Date Age.70 Age.80 Age.60 Age.40 Gender.M Gender.F
#> 1 5/21      1      1      0      0        2        0
#> 2 5/22      2      0      0      0        1        1
#> 3 5/24      0      0      1      2        2        1

reprex package (v0.3.0) 于 2021-06-11 创建

【讨论】:

  • 啊,cross() 绝对是解决这个问题的好方法。对我来说效果很好。谢谢!
  • 谢谢。这有点 hacky,因为我们必须使用 do.call("data.frame")tibble 列转换为普通列,但是变量名显示得很好,所以我会说这是一个很好的解决方法。我正在为包中的这种操作制定更好的编程实现。一旦我有一个工作版本,我会更新我的答案。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多