R - 将两个数据集与数据表合并,但保留相同的列之一



还没有找到这个,所以我们开始了。 我正在使用数据表,我想合并两个长度不同的表。 Ich已经成功地做到了这一点。

所以基本上我合并了表1中键属性"Name,Date1"与表2中的关键属性"Name,Date2"euqal的所有行。

我遇到的问题是,我的 Date2 来自我的表 2 不满意。 我不喜欢这样。我想从我的表 2 中保留我的日期 2。

例:

表1

Name   Date1
A      2018-01-01
A      2018-01-02
A      2018-01-03

表2

Name   Date2
A      2018-01-01
A      2018-01-02
A      2018-01-15

而不是在我的

新表

Name   Date
A      2018-01-01
A      2018-01-02
A      NA

它应该看起来像这样

Name   Date1         Date2
A      2018-01-01    2018-01-01
A      2018-01-02    2018-01-02
A      NA            NA

有谁知道诀窍?

Date2 不会在输出中重复,因为它用作键,并且在执行等值连接时本质上是相同的数据。并且由于您正在执行all.x=TRUE,因此它是左连接,并且只有左表(即ONE与任何其他非键列一起返回(。

如果您确实需要,可以将 Date2 复制到 Date1 中,并使用 Date1 进行连接,如下所示:

TWO[, Date1:=Date2][ONE, on=.(Name, Date1)]
#   Name      Date2      Date1
#1:    A 2018-01-01 2018-01-01
#2:    A 2018-01-02 2018-01-02
#3:    A         NA 2018-01-03

数据:

library(data.table)
ONE <- fread("Name   Date1
A      2018-01-01
A      2018-01-02
A      2018-01-03")
TWO <- fread("Name   Date2
A      2018-01-01
A      2018-01-02
A      2018-01-15")

我会使用match. 如果您的日期存储在POSIXct变体或字符串中,这应该按原样工作:

t1 <- read.table(text = "Name   Date1
A      2018-01-01
A      2018-01-02
A      2018-01-03", header = TRUE)
t2 <- read.table(text = "Name   Date2
A      2018-01-01
A      2018-01-02
A      2018-01-15", header = TRUE)
library(dplyr)
t3 <- t1 %>%
mutate(
Date2 = t2$Date2[match(Date1, t2$Date2)], # this grabs Date2 from t2 only if the same Date appears in t1
Date1 = ifelse(is.na(Date2), NA, Date1) # this sets Date1 to NA if Date2 is NA
)

如果你的日期存储为因子,则需要修改将Date1设置为 NA 的代码,如下所示(我没有弄乱日期,只是将它们作为因子保留,所以我需要这个:

Date1 = ifelse(is.na(Date2), NA, as.character(Date1))

(请注意,这在突变语句中,它不是独立的(

编辑

这是一个不使用应该适用于data.tablesmutate的变体 - 尽管我个人不使用data.table,所以请测试并确认:

t3 <- with(t1, {
Date2 <- t2$Date2[match(Date1, t2$Date2)] # this grabs Date2 from t2 only if the same Date appears in t1
Date1 <- ifelse(is.na(Date2), NA, Date1) # this sets Date1 to NA if Date2 is NA
})

这是一个sqldf解决方案:

library(sqldf)
sqldf('select a.Name, 
case when b.Date2 is NULL 
then a.Date1 = NULL
else a.Date1 
end as Date1 
,b.Date2 
from df1 as a 
left join df2 as b
on a.Name = b.Name and
a.Date1 = b.Date2')

结果:

Name      Date1      Date2
1    A 2018-01-01 2018-01-01
2    A 2018-01-02 2018-01-02
3    A       <NA>       <NA>

数据:

df1 = structure(list(Name = structure(c(1L, 1L, 1L), .Label = "A", class = "factor"), 
Date1 = structure(1:3, .Label = c("2018-01-01", "2018-01-02", 
"2018-01-03"), class = "factor")), .Names = c("Name", "Date1"
), class = "data.frame", row.names = c(NA, -3L))
df2 = structure(list(Name = structure(c(1L, 1L, 1L), .Label = "A", class = "factor"), 
Date2 = structure(1:3, .Label = c("2018-01-01", "2018-01-02", 
"2018-01-15"), class = "factor")), .Names = c("Name", "Date2"
), class = "data.frame", row.names = c(NA, -3L))

最新更新