加入 data.frame 与 R 中的重复行
Join data.frame with repeated lines in R
我有两个数据框。一个是车站 st
收集点全年不同日期的质量。另一个是当年每个 st
季节的土地利用。
Example
library(dplyr)
water_df=read.table(text="st Date OD pH DBO
A 01/07/2005 8 6.3 3
A 02/06/2005 7 6.2 2.2
A 01/01/2005 7.3 6.5 3.1
A 03/05/2006 6 6.3 4
A 09/08/2006 6.8 7.1 1.1
A 12/12/2006 7.3 8.1 2.9
B 02/07/2005 6.8 5.4 2.6
B 03/06/2005 6.0 5.3 1.9
B 02/01/2005 6.2 5.5 2.6
B 04/05/2006 5.1 5.4 3.4
B 10/08/2006 5.8 6.0 0.9
B 13/12/2006 6.2 6.9 2.5
C 20/12/2006 6.5 7.2 2.6
C 27/12/2006 6.8 7.6 2.7
C 03/01/2007 7.2 8.0 2.9
C 10/01/2007 7.5 8.4 3.0
C 17/01/2007 7.9 8.8 3.1
C 24/01/2007 8.3 9.2 3.3
C 31/01/2007 8.7 9.7 3.5
C 07/02/2007 9.2 10.2 3.6", sep="", header=TRUE)%>%as.data.frame()
land_df=read.table(text = "st year Veg Water Soil Crop Grass
A 2005 100 200 80 130 70
B 2006 98 180 84 132 86
C 2007 93 175 79 127 106", sep="", header = TRUE)%>%as.data.frame()
我想在质量 data.frame 中添加该站的土地使用价值,即使对于同一站 st
重复。
我尝试了一些方法但没有用
#I tryed cbind
join_df<-cbind(water_df, land_df)
#I tryed
library(purrr)
joind_df2<-purrr::reduce(water_df, land_df)
此操作通常称为“加入”或“合并”。您需要加入列,这意味着我们需要从您的日期中提取年份,然后这是一个 left_join
命令。 See this FAQ for more information about joining data in R.
library(dplyr)
library(lubridate)
water_df %>%
mutate(year = year(dmy(Date))) %>%
left_join(land_df, by = c("st", "year"))
# st Date OD pH DBO year Veg Water Soil Crop Grass
# 1 A 01/07/2005 8.0 6.3 3.0 2005 100 200 80 130 70
# 2 A 02/06/2005 7.0 6.2 2.2 2005 100 200 80 130 70
# 3 A 01/01/2005 7.3 6.5 3.1 2005 100 200 80 130 70
# 4 A 03/05/2006 6.0 6.3 4.0 2006 NA NA NA NA NA
# 5 A 09/08/2006 6.8 7.1 1.1 2006 NA NA NA NA NA
# 6 A 12/12/2006 7.3 8.1 2.9 2006 NA NA NA NA NA
# 7 B 02/07/2005 6.8 5.4 2.6 2005 NA NA NA NA NA
# 8 B 03/06/2005 6.0 5.3 1.9 2005 NA NA NA NA NA
# 9 B 02/01/2005 6.2 5.5 2.6 2005 NA NA NA NA NA
# 10 B 04/05/2006 5.1 5.4 3.4 2006 98 180 84 132 86
# 11 B 10/08/2006 5.8 6.0 0.9 2006 98 180 84 132 86
# 12 B 13/12/2006 6.2 6.9 2.5 2006 98 180 84 132 86
# 13 C 20/12/2006 6.5 7.2 2.6 2006 NA NA NA NA NA
# 14 C 27/12/2006 6.8 7.6 2.7 2006 NA NA NA NA NA
# 15 C 03/01/2007 7.2 8.0 2.9 2007 93 175 79 127 106
# 16 C 10/01/2007 7.5 8.4 3.0 2007 93 175 79 127 106
# 17 C 17/01/2007 7.9 8.8 3.1 2007 93 175 79 127 106
# 18 C 24/01/2007 8.3 9.2 3.3 2007 93 175 79 127 106
# 19 C 31/01/2007 8.7 9.7 3.5 2007 93 175 79 127 106
# 20 C 07/02/2007 9.2 10.2 3.6 2007 93 175 79 127 106
存在一些缺失值,您的 land_df
没有对特定年份的特定台站进行观测。看看 ?tidyr::fill
和 this FAQ 如果你想用之前的观察来填充它们。
我有两个数据框。一个是车站 st
收集点全年不同日期的质量。另一个是当年每个 st
季节的土地利用。
Example
library(dplyr)
water_df=read.table(text="st Date OD pH DBO A 01/07/2005 8 6.3 3 A 02/06/2005 7 6.2 2.2 A 01/01/2005 7.3 6.5 3.1 A 03/05/2006 6 6.3 4 A 09/08/2006 6.8 7.1 1.1 A 12/12/2006 7.3 8.1 2.9 B 02/07/2005 6.8 5.4 2.6 B 03/06/2005 6.0 5.3 1.9 B 02/01/2005 6.2 5.5 2.6 B 04/05/2006 5.1 5.4 3.4 B 10/08/2006 5.8 6.0 0.9 B 13/12/2006 6.2 6.9 2.5 C 20/12/2006 6.5 7.2 2.6 C 27/12/2006 6.8 7.6 2.7 C 03/01/2007 7.2 8.0 2.9 C 10/01/2007 7.5 8.4 3.0 C 17/01/2007 7.9 8.8 3.1 C 24/01/2007 8.3 9.2 3.3 C 31/01/2007 8.7 9.7 3.5 C 07/02/2007 9.2 10.2 3.6", sep="", header=TRUE)%>%as.data.frame() land_df=read.table(text = "st year Veg Water Soil Crop Grass A 2005 100 200 80 130 70 B 2006 98 180 84 132 86 C 2007 93 175 79 127 106", sep="", header = TRUE)%>%as.data.frame()
我想在质量 data.frame 中添加该站的土地使用价值,即使对于同一站 st
重复。
我尝试了一些方法但没有用
#I tryed cbind
join_df<-cbind(water_df, land_df)
#I tryed
library(purrr)
joind_df2<-purrr::reduce(water_df, land_df)
此操作通常称为“加入”或“合并”。您需要加入列,这意味着我们需要从您的日期中提取年份,然后这是一个 left_join
命令。 See this FAQ for more information about joining data in R.
library(dplyr)
library(lubridate)
water_df %>%
mutate(year = year(dmy(Date))) %>%
left_join(land_df, by = c("st", "year"))
# st Date OD pH DBO year Veg Water Soil Crop Grass
# 1 A 01/07/2005 8.0 6.3 3.0 2005 100 200 80 130 70
# 2 A 02/06/2005 7.0 6.2 2.2 2005 100 200 80 130 70
# 3 A 01/01/2005 7.3 6.5 3.1 2005 100 200 80 130 70
# 4 A 03/05/2006 6.0 6.3 4.0 2006 NA NA NA NA NA
# 5 A 09/08/2006 6.8 7.1 1.1 2006 NA NA NA NA NA
# 6 A 12/12/2006 7.3 8.1 2.9 2006 NA NA NA NA NA
# 7 B 02/07/2005 6.8 5.4 2.6 2005 NA NA NA NA NA
# 8 B 03/06/2005 6.0 5.3 1.9 2005 NA NA NA NA NA
# 9 B 02/01/2005 6.2 5.5 2.6 2005 NA NA NA NA NA
# 10 B 04/05/2006 5.1 5.4 3.4 2006 98 180 84 132 86
# 11 B 10/08/2006 5.8 6.0 0.9 2006 98 180 84 132 86
# 12 B 13/12/2006 6.2 6.9 2.5 2006 98 180 84 132 86
# 13 C 20/12/2006 6.5 7.2 2.6 2006 NA NA NA NA NA
# 14 C 27/12/2006 6.8 7.6 2.7 2006 NA NA NA NA NA
# 15 C 03/01/2007 7.2 8.0 2.9 2007 93 175 79 127 106
# 16 C 10/01/2007 7.5 8.4 3.0 2007 93 175 79 127 106
# 17 C 17/01/2007 7.9 8.8 3.1 2007 93 175 79 127 106
# 18 C 24/01/2007 8.3 9.2 3.3 2007 93 175 79 127 106
# 19 C 31/01/2007 8.7 9.7 3.5 2007 93 175 79 127 106
# 20 C 07/02/2007 9.2 10.2 3.6 2007 93 175 79 127 106
存在一些缺失值,您的 land_df
没有对特定年份的特定台站进行观测。看看 ?tidyr::fill
和 this FAQ 如果你想用之前的观察来填充它们。