移转带有日期作为标题的小标题,每个日期有多个观察值

时间:2019-09-30 21:24:35

标签: r tidyverse tidyr

我有一个类似这样的小标题:

   X  Form  Jan_92 Feb_92 Mar_92 (....)
<int> <fct>  <dbl> <dbl>  <dbl>
   1  var1   2.02   2.97  0.12 
   2  var2   0.23   0.28  0.33
   3  var3   0.08   0.28  0.12

我想整理一下,以便所有月/年组合(有10年的价值)都在同一列中,并且var1 / var2 / var3度量是具有各自值(对应于日期)的列名称)。

到目前为止,我已经尝试过使用t(data)进行转置,但这将其转换为数据帧,并且当我将其放回标准格式时,遇到了无法解决的奇怪的行/列命名问题。救命!

3 个答案:

答案 0 :(得分:2)

您可以这样做:

as_tibble(cbind(Dates = names(df), t(df))) %>% .[-c(1:2),]

# A tibble: 3 x 4
#  Dates  V2    V3    V4   
#  <chr>  <chr> <chr> <chr>
#1 Jan_92 2.02  0.23  0.08 
#2 Feb_92 2.97  0.28  0.28 
#3 Mar_92 0.12  0.33  0.12 

数据

df <- as_tibble(read.table(header = TRUE, text = "X Form Jan_92 Feb_92 Mar_92
1 var1 2.02 2.97 0.12
2 var2 0.23 0.28 0.33
3 var3 0.08 0.28 0.12"))

答案 1 :(得分:2)

如果您不在意X列(它只是一个计数器),那么以下内容在data.table中起作用:

library(data.table)

dcast(melt(setDT(df1), id=c("X","Form"), variable.name = "datetime"), datetime ~ Form)

#>    datetime var1 var2 var3
#> 1:   Jan_92 2.02 0.23 0.08
#> 2:   Feb_92 2.97 0.28 0.28
#> 3:   Mar_92 0.12 0.33 0.12

或其他tidyverse解决方案:

library(dplyr)
library(tidyr)

df1 %>%
  select(-X) %>% 
  gather(datetime, value, -Form) %>%
  spread(Form, value)

# >   datetime var1 var2 var3 
# > 1   Feb_92 2.97 0.28 0.28   
# > 2   Jan_92 2.02 0.23 0.08 
# > 3   Mar_92 0.12 0.33 0.12

使用akrun's data

答案 2 :(得分:1)

我们可以使用pivot_longer转换为'long'格式,然后使用pivot_wider重新塑形为'wide'

library(dplyr)
library(tidyr)
df1 %>% 
   pivot_longer(cols = -c(X, Form)) %>% 
   select(-X) %>%
   group_by(Form) %>%
   mutate(rn = row_number()) %>%       
   pivot_wider(names_from = Form, values_from = value)
# A tibble: 3 x 5
#      rn name    var1  var2  var3
#  <int> <chr>  <dbl> <dbl> <dbl>
#1     1 Jan_92  2.02  0.23  0.08
#2     2 Feb_92  2.97  0.28  0.28
#3     3 Mar_92  0.12  0.33  0.12

数据

df1 <- structure(list(X = 1:3, Form = c("var1", "var2", "var3"), Jan_92 = c(2.02, 
0.23, 0.08), Feb_92 = c(2.97, 0.28, 0.28), Mar_92 = c(0.12, 0.33, 
0.12)), class = "data.frame", row.names = c(NA, -3L))