tidyr:列名的长到长

时间:2018-02-19 23:39:07

标签: r tidyr

说我有以下数据:

df <- data.frame(Day=c(1,2,3), Asia.Temp=c(30,20,10), Asia.Humidity=c(0.5,0.2,0.1), Europe.Temp=c(50,10,20), Europe.Humidity=c(0.2,0.2,0.7), Africa.Temp=c(70,60,80), Africa.Humidity=c(0.5,0.2,0.7))

  Day Asia.Temp Asia.Humidity Europe.Temp Europe.Humidity Africa.Temp
1   1        30           0.5          50             0.2          70
2   2        20           0.2          10             0.2          60
3   3        10           0.1          20             0.7          80
  Africa.Humidity
1             0.5
2             0.2
3             0.7

我希望gather个区域成为一个列,让温度和湿度变化。

目前,我正在使用基函数reshape执行此操作。

reshape(df, timevar="Region", times=c("Asia", "Europe", "Africa"), v.names=c("Temp", "Humidity"), varying=names(df)[2:ncol(df)], direction="long")

我会得到我想要的东西:

         Day Region Temp Humidity id
1.Asia     1   Asia  0.5       30  1
2.Asia     2   Asia  0.2       20  2
3.Asia     3   Asia  0.1       10  3
1.Europe   1 Europe  0.2       50  1
2.Europe   2 Europe  0.2       10  2
3.Europe   3 Europe  0.7       20  3
1.Africa   1 Africa  0.5       70  1
2.Africa   2 Africa  0.2       60  2
3.Africa   3 Africa  0.7       80  3

id 列是不必要的。)

我使用tidyr复制此内容并不成功。我正在努力学习tidyverse,让我的代码更清晰。我能够重塑一个给定的列,但不能做类似的事情......

这可以用tidyr吗?

2 个答案:

答案 0 :(得分:3)

当然可以使用tidyr。对于一个真正长而整洁的&#34;结果,我会省略最后的%>% spread(Measurement, value);尝试一下,看看它的样子。

Here's a useful guidetidyrreshape

library(tidyr)
library(magrittr) 
# or just use library(tidyverse)
# also df is not a great variable name :)

df %>% 
  gather(key, value, -Day) %>%
  separate(key, into = c("Region", "Measurement"), sep = "\\.") %>%
  spread(Measurement, value)

  Day Region Humidity Temp
1   1 Africa      0.5   70
2   1   Asia      0.5   30
3   1 Europe      0.2   50
4   2 Africa      0.2   60
5   2   Asia      0.2   20
6   2 Europe      0.2   10
7   3 Africa      0.7   80
8   3   Asia      0.1   10
9   3 Europe      0.7   20

答案 1 :(得分:0)

这是pivot_longer的一个选项(来自新版本的tidyr_1.0.0

library(tidyr)
df %>% 
  rename_at(-1, ~str_replace(., "([^.]+)\\.([^.]+)", "\\2_\\1")) %>% 
  pivot_longer(-Day, values_to = c("Temp", "Humidity"), 
      names_to = c(".value", "Region"), names_pattern = '([^_]+)_([^_]+)')
# A tibble: 9 x 4
#    Day Region  Temp Humidity
#  <dbl> <chr>  <dbl>    <dbl>
#1     1 Asia      30      0.5
#2     1 Europe    50      0.2
#3     1 Africa    70      0.5
#4     2 Asia      20      0.2
#5     2 Europe    10      0.2
#6     2 Africa    60      0.2
#7     3 Asia      10      0.1
#8     3 Europe    20      0.7
#9     3 Africa    80      0.7