我想比较不同的日期格式并设置一个值。我有两个数据框:
数据框1:测试
head(test)
number date country
1 6317004100 2012-10-30 Italy
2 6317071200 2013-12-02 Germany
3 6317064800 2013-03-06 USA
4 6317071200 2013-11-06 Germany
5 6317071200 2013-08-12 Germany
6 6317004100 2012-10-26 Croatia
数据框2:数据框
head(dataframe)
date group
1 2012-07 1
2 2012-08 1
3 2012-09 2
4 2012-10 2
5 2012-11 2
6 2012-12 2
7 2013-01 3
8 2013-02 3
9 2013-03 3
10 2013-04 3
11 2013-05 3
12 2013-06 3
13 2013-07 4
14 2013-08 4
15 2013-09 4
16 2013-10 4
17 2013-11 4
18 2013-12 4
我要比较 test $ date 和 dataframe $ date 的规则: 2012-07中 test $ date 的所有内容都进入第1组,而2012-08中的所有内容都进入第1组,依此类推...我得到以下输出:
> test
number date country group
1 6317004100 2012-10-30 Italy 2
2 6317071200 2013-12-02 Germany 4
3 6317064800 2013-03-06 USA 4
4 6317071200 2013-11-06 Germany 4
5 6317071200 2013-08-12 Germany 4
6 6317004100 2012-10-26 Croatia 2
我尝试过:
> merge(dataframe, test, by.x="date", by.y="date")
[1] date group number country
<0 rowes> (or row.names with length 0)
但是什么也没发生。两个日期列都是因素。
有什么想法可行吗?
答案 0 :(得分:1)
一个非合并选项将使用match
。在这里,我们将test
转换为YYYY-MM格式,并用match
dataframe$date
将其转换为group
。
test$group <- dataframe$group[
match(format(as.Date(test$date), "%Y-%m"), dataframe$date)]
test
# number date country group
#1 6317004100 2012-10-30 Italy 2
#2 6317071200 2013-12-02 Germany 4
#3 6317064800 2013-03-06 USA 3
#4 6317071200 2013-11-06 Germany 4
#5 6317071200 2013-08-12 Germany 4
#6 6317004100 2012-10-26 Croatia 2
merge
选项将通过创建新的Date2
列
test$Date2 <- format(as.Date(test$date),"%Y-%m")
merge(dataframe, test, by.x = "date", by.y = "Date2")
# date group number date country
#1 2012-10 2 6317004100 2012-10-30 Italy
#2 2012-10 2 6317004100 2012-10-26 Croatia
#3 2013-03 3 6317064800 2013-03-06 USA
#4 2013-08 4 6317071200 2013-08-12 Germany
#5 2013-11 4 6317071200 2013-11-06 Germany
#6 2013-12 4 6317071200 2013-12-02 Germany
答案 1 :(得分:1)
使用tidyverse
:
df1%>%
mutate(mnt=format(as.Date(date), "%Y-%m"))%>%
left_join(df2%>%mutate(date=as.character(date)),by=c("mnt"="date"))
number date country mnt group
1 6317004100 2012-10-30 Italy 2012-10 2
2 6317071200 2013-12-02 Germany 2013-12 4
3 6317064800 2013-03-06 USA 2013-03 3
4 6317071200 2013-11-06 Germany 2013-11 4
5 6317071200 2013-08-12 Germany 2013-08 4
6 6317004100 2012-10-26 Croatia 2012-10 2