Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tidyr:列名从宽到长_R_Tidyr - Fatal编程技术网

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中的值创建列测量
,即
温度
湿度
。通过依次省略从最后一行开始的行来查看发生了什么。