【问题标题】:How do I collapse rows on key id but keep unique measurements in a new variable?如何折叠键 id 上的行但将唯一测量值保留在新变量中?
【发布时间】:2020-05-04 20:19:12
【问题描述】:

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

                                Federal.Area State Total_Miles
1                          Allentown, PA--NJ    NJ     1094508
2                          Allentown, PA--NJ    PA     9957805
3            Augusta-Richmond County, GA--SC    GA     6221747
4            Augusta-Richmond County, GA--SC    SC     2101823
5                             Beloit, WI--IL    IL      324238
6                             Beloit, WI--IL    WI      542491

我想按Federal.Area 折叠行,但创建并保留包含唯一State 和唯一Total_Miles 的新变量,使其看起来像这样:

Federal.Area          State    Total_Miles State1 State2 Total_Miles_state1 Total_Miles_state2
   <fct>                 <fct>       <dbl> <fct>  <fct>              <dbl>            <dbl>
 1 Allentown, PA--NJ     NJ        1094508 NJ     PA               1094508          9957805
 2 Augusta-Richmond Cou… GA        6221747 GA     SC               6221747          2101823
 3 Beloit, WI--IL        IL         324238 IL     WI                324238           542491

我不知道如何将变量 State 和 Total_Miles 折叠到同一行,但作为新变量键入 Federal.Area。

【问题讨论】:

  • 欢迎来到stackoverflow。代码格式化是用反引号按钮而不是单引号完成的。在大多数键盘上,反引号位于数字 1 旁边,与 ~ 位于同一键上。
  • 在您的示例中,每个联邦地区似乎有两行。总是这样吗?如果不是,当一个联邦地区有三行或更多行时,您想要的输出是什么?
  • 我很抱歉。这是我第一次真正使用该网站。我现在会尝试编辑。这实际上是一个很好的问题,在三个State 中有几个实例是一个Federal.Area。考虑到这一点,新的数据框应该真的有State3 和Total_Miles_State3。最终目标是将每个唯一的 Federal.Area(无论是 2 还是 3)折叠成一行,并从各自的 State 分配相应的 Total_Miles 作为新变量。我将使用这些新变量来计算每个federal.area 在每个州行驶的“Total_Miles”的百分比。
  • 再次道歉。我正在学习如何提出好的问题。我应该说这样做的目的是让我可以 join 这个 df 到另一个在 Federal.Area 上的键但是我不能加入它们,因为当前的 df 有多行 federal.area 而另一个 df 有只有一个

标签: r dplyr tidyverse


【解决方案1】:

也许您可以使用tidyverse 中的pivot_wider 将数据转换为宽格式。

首先将每个 Federal.Area 中的行编号为 1 和 2。然后调用 pivot_wider 将追加

library(tidyverse)

df %>%
  group_by(Federal.Area) %>%
  mutate(rn = row_number()) %>%
  pivot_wider(id_cols = Federal.Area, values_from = c(State, Total_Miles), names_from = rn) 

输出

# A tibble: 3 x 5
# Groups:   Federal.Area [3]
  Federal.Area                  State_1 State_2 Total_Miles_1 Total_Miles_2
  <chr>                         <chr>   <chr>           <int>         <int>
1 Allentown,PA--NJ              NJ      PA            1094508       9957805
2 Augusta-RichmondCounty,GA--SC GA      SC            6221747       2101823
3 Beloit,WI--IL                 IL      WI             324238        542491

数据

df <- structure(list(Federal.Area = c("Allentown,PA--NJ", "Allentown,PA--NJ", 
"Augusta-RichmondCounty,GA--SC", "Augusta-RichmondCounty,GA--SC", 
"Beloit,WI--IL", "Beloit,WI--IL"), State = c("NJ", "PA", "GA", 
"SC", "IL", "WI"), Total_Miles = c(1094508L, 9957805L, 6221747L, 
2101823L, 324238L, 542491L)), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

  • 这似乎可行 - 知道为什么会出现此错误吗?Error: ...` 不为空。我们检测到这些有问题的参数: * logical 这些点仅用于允许将来扩展,应该为空。你是否错误地指定了一个论点?运行 rlang::last_error() 以查看错误发生的位置。`
  • 全新会话 - tidyverse 为 1.3,dplyr 为 0.8.5。今天仍然遇到同样的错误
  • 这是一个恼人的vctrs 错误。请参阅此处了解简单的解决方案。 stackoverflow.com/questions/61599249/…
  • 在我修复之后,您的解决方案效果很好!!!如果我说三个带有第三个州(如纽约或其他州)的阿伦敦条目,这个解决方案会起作用吗?
  • 很高兴听到!是的,只要格式相似(例如,每个联邦地区 3 个“州”和 3 个“总里程”),它就应该适用于 2 个以上的条目。
猜你喜欢
  • 2018-01-15
  • 2022-07-18
  • 2021-04-07
  • 2015-12-10
  • 2017-11-10
  • 1970-01-01
  • 2016-09-28
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多