R根据列名拆分将数据框列转换为单列

R transform data frame columns into single column based on column name split

一个常见的数据清理问题,但有点曲折,我在执行时遇到了麻烦。

我有一个包含多列 year.month 信息的数据集,如下所示:

    loc      type  2010.01  2010.02  2010.03 
  Manhattan   a      2300     2300     2500     
  Manhattan   b      2999     2975     2975     

我想根据列名转换数据,方法是在“.”处按年和月拆分。

因此数据将如下所示:

loc        type  year   month  value
Manhattan   a    2010    01     2300
Manhattan   a    2010    02     2300
Manhattan   a    2010    03     2500
Manhattan   b    2010    01     2999
Manhattan   b    2010    02     2975
Manhattan   b    2010    03     2975

我该怎么做?

我正在考虑使用 melt,类似这样的东西,但我是 R 的新手并且知道这是不正确的:

df <- melt(df,id=1,measure=patterns(".",value.name="Value"))

您可以通过 pivot_longertidyr 中的 separate 实现此目的。试试这个:

library(dplyr)
library(tidyr)

df <- read.table(text = "loc      type  2010.01  2010.02  2010.03 
  Manhattan   a      2300     2300     2500     
  Manhattan   b      2999     2975     2975     ", header = TRUE)
df
#>         loc type X2010.01 X2010.02 X2010.03
#> 1 Manhattan    a     2300     2300     2500
#> 2 Manhattan    b     2999     2975     2975

df %>% 
  pivot_longer(-c(loc:type)) %>% 
  separate(name, into = c("year", "month")) %>% 
  mutate(year = gsub("X", "", year))
#> # A tibble: 6 x 5
#>   loc       type  year  month value
#>   <fct>     <fct> <chr> <chr> <int>
#> 1 Manhattan a     2010  01     2300
#> 2 Manhattan a     2010  02     2300
#> 3 Manhattan a     2010  03     2500
#> 4 Manhattan b     2010  01     2999
#> 5 Manhattan b     2010  02     2975
#> 6 Manhattan b     2010  03     2975

reprex package (v0.3.0)

于 2020-04-04 创建