R 从旧的 data.table 中创建具有单列指定行的新 data.table
R Creating new data.table with specified rows of a single column from an old data.table
我有以下 data.table
:
Month Day Lat Long Temperature
1: 10 01 80.0 180 -6.383330333333309
2: 10 01 77.5 180 -6.193327999999976
3: 10 01 75.0 180 -6.263328333333312
4: 10 01 72.5 180 -5.759997333333306
5: 10 01 70.0 180 -4.838330999999976
---
117020: 12 31 32.5 310 11.840003833333355
117021: 12 31 30.0 310 13.065001833333357
117022: 12 31 27.5 310 14.685003333333356
117023: 12 31 25.0 310 15.946669666666690
117024: 12 31 22.5 310 16.578336333333358
对于每个位置(由 Lat
和 Long
给出),我有从 10 月 1 日到 12 月 31 日每天的温度。
有 1,272 个位置由 Lat
的每个成对组合组成:
Lat
1 80.0
2 77.5
3 75.0
4 72.5
5 70.0
--------
21 30.0
22 27.5
23 25.0
24 22.5
和Long
:
Long
1 180.0
2 182.5
3 185.0
4 187.5
5 190.0
---------
49 300.0
50 302.5
51 305.0
52 307.5
53 310.0
我正在尝试创建一个包含 1,272 行(每个位置一列)和 92 列(每天一列)的 data.table
。该 data.table
的每个元素将包含当天该位置的温度。
关于如何在不使用 for
循环的情况下实现该目标的任何建议?
这里我们使用 ChickWeights
作为数据,我们使用 "Chick-Diet" 相当于您的 "lat-lon",而 "Time" 相当于您的 "Date":
dcast.data.table(data.table(ChickWeight), Chick + Diet ~ Time)
生产:
Chick Diet 0 2 4 6 8 10 12 14 16 18 20 21
1: 18 1 1 1 NA NA NA NA NA NA NA NA NA NA
2: 16 1 1 1 1 1 1 1 1 NA NA NA NA NA
3: 15 1 1 1 1 1 1 1 1 1 NA NA NA NA
4: 13 1 1 1 1 1 1 1 1 1 1 1 1 1
5: ... 46 rows omitted
您可能需要 lat + lon ~ Month + Day
或一些类似的公式。
以后请像我这里一样使用内置数据集reproducible提问
首先使用 lubridate
包创建一个日期值(我假设年份 = 2014,根据需要进行调整):
library(lubridate)
df$datetext <- paste(df$Month,df$Day,"2014",sep="-")
df$date <- mdy(df$datetext)
然后一种选择是使用 tidyr
包来展开列:
library(tidyr)
spread(df[,-c(1:2,6)],date,Temperature)
Lat Long 2014-10-01 2014-12-31
1 22.5 310 NA 16.57834
2 25.0 310 NA 15.94667
3 27.5 310 NA 14.68500
4 30.0 310 NA 13.06500
5 32.5 310 NA 11.84000
6 70.0 180 -4.838331 NA
7 72.5 180 -5.759997 NA
8 75.0 180 -6.263328 NA
9 77.5 180 -6.193328 NA
10 80.0 180 -6.383330 NA
我有以下 data.table
:
Month Day Lat Long Temperature
1: 10 01 80.0 180 -6.383330333333309
2: 10 01 77.5 180 -6.193327999999976
3: 10 01 75.0 180 -6.263328333333312
4: 10 01 72.5 180 -5.759997333333306
5: 10 01 70.0 180 -4.838330999999976
---
117020: 12 31 32.5 310 11.840003833333355
117021: 12 31 30.0 310 13.065001833333357
117022: 12 31 27.5 310 14.685003333333356
117023: 12 31 25.0 310 15.946669666666690
117024: 12 31 22.5 310 16.578336333333358
对于每个位置(由 Lat
和 Long
给出),我有从 10 月 1 日到 12 月 31 日每天的温度。
有 1,272 个位置由 Lat
的每个成对组合组成:
Lat
1 80.0
2 77.5
3 75.0
4 72.5
5 70.0
--------
21 30.0
22 27.5
23 25.0
24 22.5
和Long
:
Long
1 180.0
2 182.5
3 185.0
4 187.5
5 190.0
---------
49 300.0
50 302.5
51 305.0
52 307.5
53 310.0
我正在尝试创建一个包含 1,272 行(每个位置一列)和 92 列(每天一列)的 data.table
。该 data.table
的每个元素将包含当天该位置的温度。
关于如何在不使用 for
循环的情况下实现该目标的任何建议?
这里我们使用 ChickWeights
作为数据,我们使用 "Chick-Diet" 相当于您的 "lat-lon",而 "Time" 相当于您的 "Date":
dcast.data.table(data.table(ChickWeight), Chick + Diet ~ Time)
生产:
Chick Diet 0 2 4 6 8 10 12 14 16 18 20 21
1: 18 1 1 1 NA NA NA NA NA NA NA NA NA NA
2: 16 1 1 1 1 1 1 1 1 NA NA NA NA NA
3: 15 1 1 1 1 1 1 1 1 1 NA NA NA NA
4: 13 1 1 1 1 1 1 1 1 1 1 1 1 1
5: ... 46 rows omitted
您可能需要 lat + lon ~ Month + Day
或一些类似的公式。
以后请像我这里一样使用内置数据集reproducible提问
首先使用 lubridate
包创建一个日期值(我假设年份 = 2014,根据需要进行调整):
library(lubridate)
df$datetext <- paste(df$Month,df$Day,"2014",sep="-")
df$date <- mdy(df$datetext)
然后一种选择是使用 tidyr
包来展开列:
library(tidyr)
spread(df[,-c(1:2,6)],date,Temperature)
Lat Long 2014-10-01 2014-12-31
1 22.5 310 NA 16.57834
2 25.0 310 NA 15.94667
3 27.5 310 NA 14.68500
4 30.0 310 NA 13.06500
5 32.5 310 NA 11.84000
6 70.0 180 -4.838331 NA
7 72.5 180 -5.759997 NA
8 75.0 180 -6.263328 NA
9 77.5 180 -6.193328 NA
10 80.0 180 -6.383330 NA