tidyr:列名从宽到长
假设我有以下数据:tidyr:列名从宽到长,r,tidyr,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)) 我想将区域收集到一个列中,让温度和湿度变化 目前,我正在使用基本函数重塑 r
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))
我想将区域收集到一个列中,让温度和湿度变化
目前,我正在使用基本函数重塑
reshape(df, timevar="Region", times=c("Asia", "Europe", "Africa"), v.names=c("Temp", "Humidity"), varying=names(df)[2:ncol(df)], direction="long")
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
我会得到我想要的:
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
是否可以做到这一点?使用tidyr
确实可以做到这一点。为了得到“真正长而整齐”的结果,我将省略最后的%%>%排列(度量,值)
;试试看,看看它看起来怎么样
到tidyr
与重塑
reshape(df, timevar="Region", times=c("Asia", "Europe", "Africa"), v.names=c("Temp", "Humidity"), varying=names(df)[2:ncol(df)], direction="long")
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
确实可以使用
tidyr
。为了得到“真正长而整齐”的结果,我将省略最后的%%>%排列(度量,值)
;试试看,看看它看起来怎么样
到tidyr
与重塑
reshape(df, timevar="Region", times=c("Asia", "Europe", "Africa"), v.names=c("Temp", "Humidity"), varying=names(df)[2:ncol(df)], direction="long")
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
这里有一个选项,其
pivot\u更长
(来自新版本的tidyr\u 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
library(tidyr)
df%>%
在(-1,~str\u replace(,,“([^.]+)\\.([^.]+),“\\2\\\1”)%%>处重命名\u
枢轴长度(-Day,值到=c(“温度”、“湿度”),
names_to=c(“.value”,“Region”),names_pattern='([^_]+)_([^_]+))
#一个tibble:9x4
#日间区域温度湿度
#
#1亚洲30 0.5
#2 1欧洲50 0.2
#3 1非洲70 0.5
#4 2亚洲20 0.2
#5 2欧洲10 0.2
#6 2非洲60 0.2
#7 3亚洲10 0.1
#8 3欧洲20 0.7
#9 3非洲80 0.7
这里有一个选项,该选项的pivot\u更长
(来自新版本的tidyr\u 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
library(tidyr)
df%>%
在(-1,~str\u replace(,,“([^.]+)\\.([^.]+),“\\2\\\1”)%%>处重命名\u
枢轴长度(-Day,值到=c(“温度”、“湿度”),
names_to=c(“.value”,“Region”),names_pattern='([^_]+)_([^_]+))
#一个tibble:9x4
#日间区域温度湿度
#
#1亚洲30 0.5
#2 1欧洲50 0.2
#3 1非洲70 0.5
#4 2亚洲20 0.2
#5 2欧洲10 0.2
#6 2非洲60 0.2
#7 3亚洲10 0.1
#8 3欧洲20 0.7
#9 3非洲80 0.7
请您添加一条关于separate
/spread
组合正在做什么的小评论好吗?请阅读链接指南。separate
将key
列中的值拆分为两列,Region
和Measurement
。因此Africa.Temp
变成Region=Africa
Measurement=Temp
spread
然后根据Measurement
中的值创建列,即Temp
和湿度
。通过依次省略从最后一行开始的行来查看发生了什么。您是否可以添加一个关于分隔的/spread>的小注释代码>组合正在做什么?请阅读链接指南。separate
将列key
中的值拆分为两列,Region
和Measurement
。因此Africa.Temp
变为Region=Africa
,Measurement=Temp
然后从M中的值创建列测量
,即温度
和湿度
。通过依次省略从最后一行开始的行来查看发生了什么。