匹配2个不等长的日期列

时间:2017-11-08 08:34:01

标签: r date

我有以下数据样本

X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016")
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016")

我想要的输出是这样的

X                        Y
11/12/2016         11/12/2016     
12/12/2016             NA
13/12/2016         13/12/2016 
14/12/2016         14/12/2016 
15/12/2016             NA
16/12/2016             NA
17/12/2016             NA

我已经尝试了以下代码但未获得所需的输出

> X <- as.Date(data$X)
> Y <- as.Date(data$Y)
> Z <- NA
> for (i in 1:length(X)) {
+ if(X[i] == Y){
+ Z <- Y}
+ else NA }

3 个答案:

答案 0 :(得分:5)

试试这个:

您的数据:

> X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016")
> Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016")

创建NA的新矢量并进行匹配:

> Z<-rep(NA,length(X))
> Z[which(X %in% Y)]<-X[which(X %in% Y)]
> Z
[1] "11/12/2016" NA           "13/12/2016" "14/12/2016" NA           NA           NA 

您的数据框:

> data.frame(X,Y=Z)
           X          Y
1 11/12/2016 11/12/2016
2 12/12/2016       <NA>
3 13/12/2016 13/12/2016
4 14/12/2016 14/12/2016
5 15/12/2016       <NA>
6 16/12/2016       <NA>
7 17/12/2016       <NA>

答案 1 :(得分:0)

您可以使用merge

X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016")
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016")

df_X <- data.frame(X)

df_Y <- data.frame(X = Y, Y = Y)

merge(df_X, df_Y, all = TRUE)

或者,如果您喜欢tidyverse - 方法:

library(tidyverse)
X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016")
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016")

df_X <- tibble(X)

df_Y <- tibble(X = Y, Y = Y)

full_join(df_X, df_Y)

重要的是,您要复制要匹配的列并相应地命名,或使用by - 参数。

答案 2 :(得分:-1)

得到了答案!

你想要的是&#34;匹配&#34;另一个向量的一个长向量的值。为此,函数match是完美的,因为返回匹配元素的向量位置。首先,输入数据(我添加了一些更正):

# Input data
X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016")
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016")

# Transform into dates
X <- as.Date(X,"%d/%m/%Y")
Y <- as.Date(Y, "%d/%m/%Y")

然后,我根据长向量Z创建data.frame X,并添加向量Y的匹配值:

# Run function match so you can see what can of output generates
match(x = X, table = Y)

# Create data.frame
Z <- data.frame(X = X, 
                # add matched values
              Y = Y[match(x = X, table = Y)]) 

希望这有帮助。