我有一个类似这样的小标题:
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)进行转置,但这将其转换为数据帧,并且当我将其放回标准格式时,遇到了无法解决的奇怪的行/列命名问题。救命!
答案 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))