R 从列名中提取日期以创建时间序列
我有一个数据框架,包括评估地点、不同植被指数和不同日期的计算。我需要将所有信息连接到一个新的data.frame中,其中嵌入在植被指数中的日期信息包含在输出数据框中的一个单独列中 我的数据帧具有以下结构:R 从列名中提取日期以创建时间序列,r,indexing,time-series,tidyr,R,Indexing,Time Series,Tidyr,我有一个数据框架,包括评估地点、不同植被指数和不同日期的计算。我需要将所有信息连接到一个新的data.frame中,其中嵌入在植被指数中的日期信息包含在输出数据框中的一个单独列中 我的数据帧具有以下结构: df.16 <- data.frame(ID=c("a","b","c"), SUGAR=c(152232.92, 117937.06, 72080.81),
df.16 <- data.frame(ID=c("a","b","c"),
SUGAR=c(152232.92, 117937.06, 72080.81),
EVI_20160616_re=c(0.51, 0.59, 0.37), # The date is included in the column name.
EVI_20161006_re=c(0.59, 0.34, 0.46),
GNDVI_20160616_re=c(0.51, 0.59, 0.37),
GNDVI_20161006_re=c(0.59, 0.34, 0.46),
NDVI_20160616_re=c(0.51, 0.59, 0.37),
NDVI_20161006_re=c(0.59, 0.34, 0.46),
stringsAsFactors=FALSE)
我想得到一个新的data.frame,其结构如下,这样每个观测行都列出了给定日期和评估地点的植被指数EVI、GNDVI和NDVI以及SUGAR列
使用tidyr和dplyr:
使用R4.0和最新版本的tidyr 1.1.0和dplyr 1.0.0,pivot_不再支持在窄格式数据集中将列名拆分为多个变量。拆分后,我们可以使用pivot_更广泛地为EVI、GNDVI和NDVI创建列。由于输入数据框中变量名的_re部分似乎不相关,因此我们使用select将它们从输出中删除
df.16 <- data.frame(ID=c("a","b","c"),
SUGAR=c(152232.92, 117937.06, 72080.81),
EVI_20160616_re=c(0.51, 0.59, 0.37), # The date is included in the column name.
EVI_20161006_re=c(0.59, 0.34, 0.46),
GNDVI_20160616_re=c(0.51, 0.59, 0.37),
GNDVI_20161006_re=c(0.59, 0.34, 0.46),
NDVI_20160616_re=c(0.51, 0.59, 0.37),
NDVI_20161006_re=c(0.59, 0.34, 0.46),
stringsAsFactors=FALSE)
library(tidyr)
library(dplyr)
df.16 %>%
pivot_longer(.,-c(ID,SUGAR),names_to=c("variable","DATE","RE"),
names_sep = "_",values_to = "value") %>%
select(-RE) %>%
pivot_wider(.,c(ID,DATE,SUGAR),names_from=variable,values_from=value)
…以及输出:
# A tibble: 6 x 6
ID DATE SUGAR EVI GNDVI NDVI
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 a 20160616 152233. 0.51 0.51 0.51
2 a 20161006 152233. 0.59 0.59 0.59
3 b 20160616 117937. 0.59 0.59 0.59
4 b 20161006 117937. 0.34 0.34 0.34
5 c 20160616 72081. 0.37 0.37 0.37
6 c 20161006 72081. 0.46 0.46 0.46
# A tibble: 6 x 6
# Groups: ID, SUGAR [3]
ID DATE SUGAR EVI GNDVI NDVI
<chr> <date> <dbl> <dbl> <dbl> <dbl>
1 a 2016-06-16 152233. 0.51 0.51 0.51
2 a 2016-10-06 152233. 0.59 0.59 0.59
3 b 2016-06-16 117937. 0.59 0.59 0.59
4 b 2016-10-06 117937. 0.34 0.34 0.34
5 c 2016-06-16 72081. 0.37 0.37 0.37
6 c 2016-10-06 72081. 0.46 0.46 0.46
除了使用pivot_longer/pivot_wide的@LenGreski answer外,还可以单独使用pivot_longer,通过使用names_模式将字符组捕获为regex模式。。。基于列名中的模式。在这里,正则表达式用于从字符串的开始^捕获第一组不是[^]+的字符,然后是u,然后是第二组不是下划线的字符,然后是re,如果需要,将“DATE”从lubridate转换为日期类ymd。另外,请注意在名称_到中指定向量的顺序。在这里,“值”部分指定值应进入的列,“日期”是列名的第二部分
library(dplyr) # 1.0.0
library(tidyr)
library(lubridate)
df.16 %>%
pivot_longer(cols = contains("_"), names_to = c(".value", "DATE"),
names_pattern= "^([^_]+)_([^_]+)_re") %>%
mutate(DATE = ymd(DATE))
# A tibble: 6 x 6
# ID SUGAR DATE EVI GNDVI NDVI
# <chr> <dbl> <date> <dbl> <dbl> <dbl>
#1 a 152233. 2016-06-16 0.51 0.51 0.51
#2 a 152233. 2016-10-06 0.59 0.59 0.59
#3 b 117937. 2016-06-16 0.59 0.59 0.59
#4 b 117937. 2016-10-06 0.34 0.34 0.34
#5 c 72081. 2016-06-16 0.37 0.37 0.37
#6 c 72081. 2016-10-06 0.46 0.46 0.46
欢迎来到Stackoverflow!加入数据帧时,至少需要两个数据帧。您的代码只显示一个数据帧。另一个数据框在哪里?很抱歉问题的标题不正确欢迎来到Stackoverflow,Bryan。你的问题的目的似乎是从植被指数的列名中提取日期,因此我相应地编辑了你的问题。请检查并确认我准确理解您的问题。
# A tibble: 6 x 6
# Groups: ID, SUGAR [3]
ID DATE SUGAR EVI GNDVI NDVI
<chr> <date> <dbl> <dbl> <dbl> <dbl>
1 a 2016-06-16 152233. 0.51 0.51 0.51
2 a 2016-10-06 152233. 0.59 0.59 0.59
3 b 2016-06-16 117937. 0.59 0.59 0.59
4 b 2016-10-06 117937. 0.34 0.34 0.34
5 c 2016-06-16 72081. 0.37 0.37 0.37
6 c 2016-10-06 72081. 0.46 0.46 0.46
library(dplyr) # 1.0.0
library(tidyr)
library(lubridate)
df.16 %>%
pivot_longer(cols = contains("_"), names_to = c(".value", "DATE"),
names_pattern= "^([^_]+)_([^_]+)_re") %>%
mutate(DATE = ymd(DATE))
# A tibble: 6 x 6
# ID SUGAR DATE EVI GNDVI NDVI
# <chr> <dbl> <date> <dbl> <dbl> <dbl>
#1 a 152233. 2016-06-16 0.51 0.51 0.51
#2 a 152233. 2016-10-06 0.59 0.59 0.59
#3 b 117937. 2016-06-16 0.59 0.59 0.59
#4 b 117937. 2016-10-06 0.34 0.34 0.34
#5 c 72081. 2016-06-16 0.37 0.37 0.37
#6 c 72081. 2016-10-06 0.46 0.46 0.46