如何将data.table转换为每个ID更改的列列表

时间:2018-04-19 10:22:52

标签: r data.table transformation

我想知道是否有人可以帮我解决以下问题。我不确定如何在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

2 个答案:

答案 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