考虑以下数据集
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][]
这是模棱两可的,因为ID
是data_00
和data_01
中的列名。
无论如何,恕我直言,sindri_baldur建议的加入是一种更清洁的方式。