我有一个数据帧记录不同位置的温度,另一个数据帧记录观察温度数据的日期。
例如,
temperature <- read.table(header=TRUE, text='
NewYork Boston Madison
32 22 7
27 13 28
15 0 5 ')
date <- read.table(header=TRUE, text='
NewYork Boston Madison
2013-08-09 2002-04-01 2003-08-09
2004-07-11 2003-09-12 2002-12-23
2006-08-05 2005-11-09 2005-02-05 ')
我使用“apply”函数来获取温度数据的顺序,但我如何根据我得到的顺序排列我的日期数据。
apply(temperature, 2, order)
我们可以使用Map
从另一个数据集中的order
对一个数据集的相应列进行排序
date[] <- Map(function(x, y) x[order(y)], date, temperature)
这是一种使用reshape2
的方法,该方法将每个城市的观测值与该城市记录的日期进行匹配。结果是9行数据,除了温度值之外还有城市名称和日期列。
temperature <- read.table(header = TRUE, text = '
NewYork Boston Madison
32 22 7
27 13 28
15 0 5 ')
date <- read.table(header = TRUE, text = '
NewYork Boston Madison
2013-08-09 2002-04-01 2003-08-09
2004-07-11 2003-09-12 2002-12-23
2006-08-05 2005-11-09 2005-02-05 ')
library(reshape2)
meltTemp <- melt(temperature)
meltTemp$date <- melt(date,measure.vars=c("NewYork","Boston","Madison"))[,"value"]
meltTemp
......和输出。
> meltTemp
variable value date
1 NewYork 32 2013-08-09
2 NewYork 27 2004-07-11
3 NewYork 15 2006-08-05
4 Boston 22 2002-04-01
5 Boston 13 2003-09-12
6 Boston 0 2005-11-09
7 Madison 7 2003-08-09
8 Madison 28 2002-12-23
9 Madison 5 2005-02-05
>
如果添加行索引以维护行位置信息并将数据帧重新整形为长格式,则可以加入它们。随着tidyr::gather
和dplyr::inner_join
,
library(tidyverse)
temperature <- read_table(
'NewYork Boston Madison
32 22 7
27 13 28
15 0 5')
date <- read_table(
'NewYork Boston Madison
2013-08-09 2002-04-01 2003-08-09
2004-07-11 2003-09-12 2002-12-23
2006-08-05 2005-11-09 2005-02-05')
temp_date <- inner_join(
date %>% rowid_to_column('i') %>% gather(city, date, -i),
temperature %>% rowid_to_column('i') %>% gather(city, temp, -i)
)
#> Joining, by = c("i", "city")
temp_date
#> # A tibble: 9 x 4
#> i city date temp
#> <int> <chr> <date> <int>
#> 1 1 NewYork 2013-08-09 32
#> 2 2 NewYork 2004-07-11 27
#> 3 3 NewYork 2006-08-05 15
#> 4 1 Boston 2002-04-01 22
#> 5 2 Boston 2003-09-12 13
#> 6 3 Boston 2005-11-09 0
#> 7 1 Madison 2003-08-09 7
#> 8 2 Madison 2002-12-23 28
#> 9 3 Madison 2005-02-05 5