首页 > 解决方案 > 如何转置单列以适应 R 中时间序列中的其余数据?

问题描述

我已经尽力寻找类似的问题,但找不到我正在寻找的确切内容。我有一个关于 2012-2021 年荷兰各省犯罪统计数据的数据集。我从警方获得的数据将所有不同的犯罪记录在一个列中,并提供每年每月的数据。对于我的分析,我实际上想将每个犯罪都用作一个变量,因此每种犯罪类型都需要在其自己的列中,并具有适当数量的已登记犯罪。我对如何转置这些数据以使其正常工作感到非常困惑。

如果我不清楚我在这里的意思是一个例子。

我的数据目前看起来像这样:

      ID crime_name  Province Year Month Reg_crimes
1  1      Total Groningen 2012    01       2913
2  2      Total Groningen 2012    02       2399
3  3      Total Groningen 2012    03       2870
4  4      Total Groningen 2012    04       2649
5  5      Total Groningen 2012    05       2891
6  6      Total Groningen 2012    06       2710

crime_name 是 48 种不同类型的犯罪(对于这个例子,它只给我 Total,但还有更多),Reg_crimes 是该类型在特定月份的登记犯罪数量。

理想情况下,我希望它看起来像这样:

  ID  Province Year Month      Total  Type_1  Type_2 Type_3 ....... Type_48
1  1 Groningen 2012    01       2913
2  2 Groningen 2012    02       2399
3  3 Groningen 2012    03       2870
4  4 Groningen 2012    04       2649
5  5 Groningen 2012    05       2891
6  6 Groningen 2012    06       2710

我希望这很清楚,我试图用语言表达有点困难,但我会很乐意回答所有问题,以防有一些混淆。

这是我的数据示例:

ds <- structure(list(ID = 1:6, crime_name = c("Total", "Total", "Total", 
"Total", "Total", "Total"), Province = c("Groningen", "Groningen", 
"Groningen", "Groningen", "Groningen", "Groningen"), Year = c("2012", 
"2012", "2012", "2012", "2012", "2012"), Month = c("01", "02", 
"03", "04", "05", "06"), Reg_crimes = c("    2913", "    2399", 
"    2870", "    2649", "    2891", "    2710")), row.names = c(NA, 
6L), class = "data.frame")

标签: r

解决方案


这是一个tidyr也使用新的基本 R 管道运算符的解决方案。

ds |> tidyr::pivot_wider(
  id_cols = -c(crime_name, Reg_crimes),
  names_from = crime_name,
  values_from = Reg_crimes
)
## A tibble: 6 x 5
#     ID Province  Year  Month Total     
#  <int> <chr>     <chr> <chr> <chr>     
#1     1 Groningen 2012  01    "    2913"
#2     2 Groningen 2012  02    "    2399"
#3     3 Groningen 2012  03    "    2870"
#4     4 Groningen 2012  04    "    2649"
#5     5 Groningen 2012  05    "    2891"
#6     6 Groningen 2012  06    "    2710"

没有管道:

tidyr::pivot_wider(
  data = ds,
  id_cols = -c(crime_name, Reg_crimes),
  names_from = crime_name,
  values_from = Reg_crimes
)

推荐阅读