本文介绍了比较data.table的两行,仅显示具有差异的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我得到了一个大的data.table,该表具有不同类型的列:数字或字符。例如,
I am given a large data.table, which has columns of different types: e.g. numeric or character. E.g.
data.table(name=c("A","A"),val1=c(1,2),val2=c(3,3),cat=c("u","v"))
name val1 val2 cat
1: A 1 3 u
2: A 2 3 v
结果,我想要一个data.table,只包含列,其中两行之间的条目不同:
As a results, I would like a data.table just with the columns, where the entries are different between the two rows:
data.table(val1=c(1,2),cat=c("u","v"))
val1 cat
1: 1 u
2: 2 v
推荐答案
您可以检查列中是否只有一个值,而只返回一个以上的值:
You can check whether there is only one value in the column and return only the ones with more than one value:
mydt <- data.table(name=c("A", "A"), val1=c(1, 2), val2=c(3, 3), cat=c("u", "v"))
mydt_red <- mydt[, lapply(.SD, function(x) if(length(unique(x))!=1) x else NULL)]
mydt_red
# val1 cat
#1: 1 u
#2: 2 v
编辑
由设计,一种更有效的获取结果的方法是使用 min
和 max
函数,并将它们与 Filter
组合:
EDIT
As mentionned by @kath, a more efficient way to get your result is to use min
and max
functions and to combine them with Filter
:
mydt_red2 <- Filter(function(x) min(x)!=max(x), mydt)
一些基本基准测试
Some basic benchmarking
# Data (inspired by https://stackoverflow.com/a/35746513/680068)
nrow=10000
ncol=10000
mydt <- data.frame(matrix(sample(1:(ncol*nrow),ncol*nrow,replace = FALSE), ncol = ncol))
setDT(mydt)
system.time(mydt_redUni <- mydt[, lapply(.SD, function(x) if(length(unique(x))>1) x else NULL)])
#utilisateur système écoulé
# 2.31 0.52 2.83
system.time(mydt_redFilt <- Filter(function(x) length(unique(x)) > 1, mydt))
#utilisateur système écoulé
# 1.65 0.22 1.87
system.time(mydt_redSort <- mydt[, lapply(.SD, function(x) {xs <- sort(x); if(xs[1]!=tail(xs, 1)) x else NULL})])
#utilisateur système écoulé
# 3.87 0.00 3.87
system.time(mydt_redMinMax <- mydt[, lapply(.SD, function(x) if(min(x)!=max(x)) x else NULL)])
#utilisateur système écoulé
# 0.67 0.00 0.67
system.time(mydt_redFiltminmax <- Filter(function(x) min(x)!=max(x), mydt))
#utilisateur système écoulé
# 0.13 0.01 0.14
system.time(mydt_redSotos <- Filter(function(i)var(as.numeric(as.factor(i))) != 0, mydt))
#utilisateur système écoulé
# 100.76 0.05 100.84
这篇关于比较data.table的两行,仅显示具有差异的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!