说我有以下数据:
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
吗?
答案 0 :(得分:3)
当然可以使用tidyr
。对于一个真正长而整洁的&#34;结果,我会省略最后的%>% spread(Measurement, value)
;尝试一下,看看它的样子。
Here's a useful guide至tidyr
与reshape
。
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