使用 data.table 比较两个数据集

Comparing two datasets using data.table

考虑以下数据集

data_00 <- data.table(ID = c(1,1,1,2,2,2,3,3,3,4,5,5,6), 
                COLOUR = c("blue","green","yellow","yellow","red","blue","green","green","white","green","blue","yellow","white"))

data_01 <- data.table(ID=c(1,2,2,2,3,3,4,4,5,6,6),
                COLOUR=c("red","blue","green","white","yellow","blue","white","green","blue","white","pink"))

  ID COLOUR
 1:  1   blue
 2:  1  green
 3:  1 yellow
 4:  2 yellow
 5:  2    red
 6:  2   blue
 7:  3  green
 8:  3  green
 9:  3  white
10:  4  green
11:  5   blue
12:  5 yellow
13:  6  white

    ID COLOUR
 1:  1    red
 2:  2   blue
 3:  2  green
 4:  2  white
 5:  3 yellow
 6:  3   blue
 7:  4  white
 8:  4  green
 9:  5   blue
10:  6  white
11:  6   pink

用ID代表一个人的身份,给这个人房间的墙壁颜色上色。我使用 data.table 包,因为实际数据非常大,因此需要一个高效的包。我想将 b 中的颜色与 a 中的颜色进行比较,调查特定家庭是否在前一年也有这种墙壁颜色,并将第三列添加到 data_01 中,其中包含此问题的逻辑值。

我试过

data_01 <- data_01[COLOUR00:=(COLOUR %in% data_00$ID[COLOUR]),by=ID]
but the logical values returned are wrong.

预期输出应该是:

   ID COLOUR PREV_YEAR
 1:  1    red     FALSE
 2:  2   blue      TRUE
 3:  2  green     FALSE
 4:  2  white     FALSE
 5:  3 yellow     FALSE
 6:  3   blue     FALSE
 7:  4  white     FALSE
 8:  4  green      TRUE
 9:  5   blue      TRUE
10:  6  white      TRUE
11:  6   pink     FALSE

我想要一个额外的行来指示前一年家庭中是否存在这种颜色。 有人可以帮我解决这个问题吗?

一个非常简单的方法是:

data_01[, last_year := paste(ID,COLOUR) %chin% data_00[, paste(ID,COLOUR)]]

    ID COLOUR last_year
 1:  1    red     FALSE
 2:  2   blue      TRUE
 3:  2  green     FALSE
 4:  2  white     FALSE
 5:  3 yellow     FALSE
 6:  3   blue     FALSE
 7:  4  white     FALSE
 8:  4  green      TRUE
 9:  5   blue      TRUE
10:  6  white      TRUE
11:  6   pink     FALSE

使用联接:

data_01[, last_year := FALSE
        ][data_00, on = .(ID,COLOUR), last_year := TRUE]

OP 的方法是检查 data_01 中的颜色是否包含在相同 ID.

的前一年颜色的向量中

对 OP 的代码进行了一些修改,

data_01[, COLOR00 := COLOUR %in% data_00[.BY == ID, COLOUR], by = ID][]

returns 预期结果:

    ID COLOUR COLOR00
 1:  1    red   FALSE
 2:  2   blue    TRUE
 3:  2  green   FALSE
 4:  2  white   FALSE
 5:  3 yellow   FALSE
 6:  3   blue   FALSE
 7:  4  white   FALSE
 8:  4  green    TRUE
 9:  5   blue    TRUE
10:  6  white    TRUE
11:  6   pink   FALSE

一些修改是由于 data.table 语法与基本 R data.frame.

的差异造成的

然而,主要技巧是使用特殊符号 .BY 来查找匹配 ID 的行。 .BY 是一个列表,其中包含实际组的 by = 子句中的项目。没有.BY,我们很想写

data_01[, COLOR00 := COLOUR %in% data_00[ID == ID, COLOUR], by = ID][]

这是不明确的,因为 IDdata_00data_01 中的列名。

无论如何,恕我直言, 建议的连接是一种更简洁的方法。