我想知道是否有人可以帮我解决以下问题。我不确定如何在data.table中执行此操作,但我相信这是可能的。
假设我们有以下data.table:
test <- data.table(ID = c(1,1,1,2,2,2,2,2,3,3,3), A = rep(1,11), B = c(1,2,3,1,1,1,1,1,1,1,1), C = c(1,2,1,2,2,3,3,1,1,1,1))
我们可以清楚地看到,如果ID = 1,则列B和C发生变化,给定ID = 2,列C仅更改并且给定ID = 3,列中没有一个发生变化。 我不确定如何在不编写for循环的情况下执行此操作,这在给定数据大小的情况下是不可行的。输出应为:
ID | ChangedColumn
1 | B
1 | C
2 | C
答案 0 :(得分:3)
您可以转换为长格式,然后计算更改:
melt(test, id.vars = "ID")[, uniqueN(value) > 1, by = .(ID, variable)][(V1), !"V1"]
ID variable
1: 1 B
2: 1 C
3: 2 C
如果您仍在使用不使用!
支持列否定的旧版data.table版本,则可以使用此代码:
melt(test, id.vars = "ID")[, uniqueN(value) > 1, by = .(ID, variable)][(V1),
.(ID, variable)]
答案 1 :(得分:0)
或者您可以使用矩阵获得结果:
test[, as.list(lapply(.SD, uniqueN) != 1L), by = ID]
# ID A B C
# 1: 1 FALSE TRUE TRUE
# 2: 2 FALSE FALSE TRUE
# 3: 3 FALSE FALSE FALSE