簡體   English   中英

根據 R 中的另一個表在數據集中創建一個“標志”列

[英]Create a "flag" column in a dataset based on a another table in R

我有兩個數據集: dataset1dataset2

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_customerdate (格式 YYYY-mm)。 這些對應於在指定月份內與源數據集 ( dataset1 ) 中其他狀態不同的客戶。

dataset1是我有id_customerid_orderdate的交易列表(格式 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 中所指定)。 該條件意味着dt1dt2之間的匹配; 因此我們使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM