![](/img/trans.png)
[英]Create new column in dataframe based on another and matching to another dataset in R
[英]Create a "flag" column in a dataset based on a another table in R
我有兩個數據集: dataset1
和dataset2
。
zz <- "id_customer id_order order_date
1 1 2018-10
1 2 2018-11
2 3 2019-05
3 4 2019-06"
dataset1 <- read.table(text=zz, header=TRUE)
yy <- "id_customer order_date
1 2018-10
3 2019-06"
dataset2 <- read.table(text=yy, header=TRUE)
dataset2
是查詢的結果,其中我有兩列: id_customer
和date
(格式 YYYY-mm)。 這些對應於在指定月份內與源數據集 ( dataset1
) 中其他狀態不同的客戶。
dataset1
是我有id_customer
、 id_order
和date
的交易列表(格式 YYYY-mm 也是如此)。 如果客戶 id 出現在dataset2
中,我想豐富dataset1
的每一行設置為 1 的“標志”列,在相應的月份。
我嘗試了以下方法:
dataset$flag <- ifelse(dataset1$id_customer %in% dataset2$id_customer &
dataset1$date == dataset2$date,
"1", "0")
但我收到一條警告消息,上面寫着“較長的 object 長度不是較短 object 長度的倍數”。 我明白這一點,但無法提出解決方案。 有人可以幫忙嗎?
您可以向 dataset2 添加一個標志,然后使用merge()
,保留 dataset1 中的所有行。 借用克里斯的數據:
dataset2$flag <- 1
merge(dataset1, dataset2, all.x = TRUE)
ID Date flag
1 1 2018-12 NA
2 1 2019-11 NA
3 2 2018-13 NA
4 2 2019-10 NA
5 2 2019-11 1
6 2 2019-12 NA
7 2 2019-12 NA
8 3 2018-12 1
9 3 2018-12 1
10 4 2018-13 1
編輯:這似乎有效:
說明性數據:
set.seed(100)
dt1 <- data.frame(
ID = sample(1:4, 10, replace = T),
Date = paste0(sample(2018:2019, 10, replace = T),"-", sample(10:13, 10, replace = T))
)
dt1
ID Date
1 2 2019-12
2 2 2019-12
3 3 2018-12
4 1 2018-12
5 2 2019-11
6 2 2019-10
7 4 2018-13
8 2 2018-13
9 3 2018-12
10 1 2019-11
dt2 <- data.frame(
ID = sample(1:4, 5, replace = T),
Date = paste0(sample(2018:2019, 5, replace = T),"-", sample(10:13, 5, replace = T))
)
dt2
ID Date
1 2 2019-11
2 4 2018-13
3 2 2019-13
4 4 2019-13
5 3 2018-12
解決方案:
該解決方案使用ifelse
來定義設置“標志” 1
(如 OP 中所指定)。 該條件意味着dt1
和dt2
之間的匹配; 因此我們使用match
。 一個復雜的因素是條件需要在每個數據幀中的兩列之間進行雙重匹配。 因此,我們使用apply
使用paste0
將兩列中的行粘貼在一起,並在這些復合字符串中搜索匹配項:
dt1$flag <- ifelse(match(apply(dt1[,1:2], 1, paste0, collapse = " "),
apply(dt2[,1:2], 1, paste0, collapse = " ")), 1, "NA")
結果:
dt1
ID Date flag
1 2 2019-12 NA
2 2 2019-12 NA
3 3 2018-12 1
4 1 2018-12 NA
5 2 2019-11 1
6 2 2019-10 NA
7 4 2018-13 1
8 2 2018-13 NA
9 3 2018-12 1
10 1 2019-11 NA
要檢查結果,我們可以將它們與從merge
獲得的結果進行比較:
flagged_only <- merge(dt1, dt2)
flagged_only
ID Date
1 2 2019-11
2 3 2018-12
3 3 2018-12
4 4 2018-13
數據幀flagged_only
包含與dt1
標記為1
行完全相同的四行——瞧!
非常的是以data.table
的方式添加對應的flag:
# Load library
library(data.table)
# Convert created tables to data.table object
setDT(dataset1)
setDT(dataset2)
# Add {0, 1} to dataset1 if the row can be found in dataset2
dataset1[, flag := 0][dataset2, flag := 1, on = .(id_customer, order_date)]
結果如下所示:
> dataset1
id_customer id_order order_date flag
1: 1 1 2018-10 1
2: 1 2 2018-11 0
3: 2 3 2019-05 0
4: 3 4 2019-06 1
如果您在數據集中擁有完整的日期/時間,則需要進行更多操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.