使用 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][]
这是不明确的,因为 ID
是 data_00
和 data_01
中的列名。
无论如何,恕我直言, 建议的连接是一种更简洁的方法。
考虑以下数据集
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][]
这是不明确的,因为 ID
是 data_00
和 data_01
中的列名。
无论如何,恕我直言,