R 匹配两个长度不等的日期列
我有以下数据样本R 匹配两个长度不等的日期列,r,date,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 <- as.Date(data$X) > Y <- as.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 <- 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 }
>X Y Z表示(i/1:长度(X)){
+如果(X[i]==Y){
+Z试试这个:
您的数据:
>xy试试这个:
您的数据:
>xy您可以使用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)
重要的一点是,复制要匹配的列并相应地命名,或者使用by
-参数。可以使用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)
重要的一点是,复制要匹配的列并相应地命名,或者使用by
-参数。得到了答案
您需要的是将一个长向量的值与另一个向量的值“匹配”。为此,函数match
非常完美,因为它返回匹配元素的向量位置。首先,输入数据(我添加了一些更正):
希望这有帮助。找到答案了
您需要的是将一个长向量的值与另一个向量的值“匹配”。为此,函数match
非常完美,因为它返回匹配元素的向量位置。首先,输入数据(我添加了一些更正):
希望这有帮助。您的输出与您的X
和Y
输入不匹配。根据您提供的数据,您应该在第一行中得到错误。as.Date(X)
对不起,我的错误。现在编辑输入是否在if(X[i]=Y)中缺少一个[i]
?请注意,11/12/2016=0.0004546958
。因此,它是一个数字
而不是一个日期
。将您的日期
设置为如下字符串“11/12/2016”
,然后将其转换为日期,如以下所示as.date(“11/12/2016”,“d/%m/%Y”)
,最后使用您想要的格式格式(as.date(“11/12/2016”),%d/%m/%Y”),%d/%m/%Y”)
您的输出与X
和Y
输入不匹配。根据您提供的数据,您应该会在第一行本身出现错误。as.Date(X)
对不起,我的错误。现在编辑了输入,您只是在if(X[i]=Y)中缺少了一个[i]
?请注意,11/12/2016=0.0004546958
。因此,它是一个数字
而不是一个日期
。将您的日期
设置为如下字符串“11/12/2016”
,然后将其转换为日期,如以下所示as.date(“11/12/2016”,“d/%m/%Y”)
,最后使用您想要的格式格式(as.date(“11/12/2016”),%d/%m/%Y”),%d/%m/%Y”)
你不需要哪一个。除此之外,这个解决方案应该被接受,而不是模仿Santi的解决方案。至少你从我这里得到+1;-)不幸的是,Santi给出了正确的另一个答案,尽管我先回答了:-(.我真的很感激你的+1,它对我帮助很大。你不需要哪个。除此之外,这个解决方案应该被接受,而不是模仿桑蒂的解决方案。至少你从我这里得到+1;-)不幸的是,桑蒂给出了正确的另一个答案,尽管我先回答了:(.我真的很感激你的+1,它对我帮助很大。
> 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>
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)
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)
# 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")
# 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)])