我将数据排列在中,data.table
并创建了livar
包含列表或有时包含列表的列。每行代表一个唯一记录的多个记录。该列livar
汇总data.table
列表中唯一记录的变量(不再存在)的所有观察值,或者列表的列表中有一个记录的多个条目时。
我现在要检查列livar
中一行的所有列表是否都相同。在提供的代码中,我希望该列的第一行same
是FALSE
,第二和第三行是TRUE
。如以下几行所示,代码按预期工作,但在data.table
上下文中不起作用。有人可以帮忙吗?
a <- c(123456, NA, 456789, NA, NA)
b <- c(NA, NA)
c <- c(123456, NA, 987654, NA, NA)
d <- c(123456, NA, 987654, NA, NA)
e <- c(NA, NA)
li1 <- list(a, b)
li2 <- list(c, d)
DT <- data.table(c(1,2,3))
DT[, livar := list(li1, li2, e)]
DT[, same := length(unique(livar))==1] # FALSE
length(unique(li1))==1 # FALSE
length(unique(li2))==1 # TRUE
length(unique(e))==1 # TRUE
length(unique(c(NA, NA)))==1 # TRUE
如前所述chinsoon12
,为了进入列表的每个列表,以下行中缺少* apply。
DT[, same := sapply(livar, function(x) length(unique(x))==1L)]