r语言 - 使用 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

身份证代表一个人的身份,并为该人房间的墙壁颜色着色。我使用 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][]

返回预期结果:

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语法与基 Rdata.frame的差异。

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

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

这是模棱两可的,因为IDdata_00data_01中的列名。

无论如何,恕我直言,sindri_baldur建议的加入是一种更清洁的方式。

相关内容

  • 没有找到相关文章

最新更新