理解data.table(和data.frame)中的重复项

时间:2014-06-12 05:28:46

标签: r data.table

我很难理解duplicated()。

首先,钻石数据集中是否存在重复是否正确? 其次,考虑到我使用重复数据删除的数据集,熔化的data.table中的重复项来自哪里?

library(data.table)
library(reshape2)
library(ggplot2)
data(diamonds)

# duplicates in data.frame
dups.df = nrow(diamonds[duplicated(diamonds),])  # 146 records
diamonds.dedup = unique(diamonds)

dt = as.data.table(diamonds.dedup)

d = melt(dt, value.var = "cut")
dups.d = d[duplicated(d),]
nrow(dups.d)  # 232821 records

2 个答案:

答案 0 :(得分:2)

不使用54K行数据集可以帮助您找出正在发生的事情。 E.g:

test <- data.frame(a=c(1,1,2,2),b=c(1,1,4,4),vals1=c(2,2,3,4),vals2=3:6)
test <- test[c(1:4,4),]   # make it have a duplicated row
test <- unique(test)      # now get rid of it just to prove a point

#  a b vals1 vals2
#1 1 1     2     3
#2 1 1     2     4
#3 2 4     3     5
#4 2 4     4     6

现在将此数据融化为您的工作方式:

melt(id=c("a","b"),data=test)

#  a b variable value
#1 1 1    vals1     2
#2 1 1    vals1     2  ## duplicate!
#3 2 4    vals1     3
#4 2 4    vals1     4
#5 1 1    vals2     3
#6 1 1    vals2     4
#7 2 4    vals2     5
#8 2 4    vals2     6

惊喜,现在你有了重复 您以前在a/bvals1/vals2的idvars中查找完全相同的行,现在您只需匹配id个变量和value对应的vals1 {1}}。

答案 1 :(得分:1)

如果用最初的钻石套装替换最后一行代码

dt = as.data.table(diamonds) d = melt(dt, value.var = "cut") dups.d = d[duplicated(d),] nrow(dups.d) # 233843 records

您将看到重复记录的数量(233843而不是232821)高于重复数据删除集。想想duplicated如何在融化的数据表上工作!