我有一个包含11个变量和200,000+行的
我正在寻找类似于Stata中的isid的东西,它可以检查指定的变量是否唯一地标识观测值。有人能帮忙吗?
data.table
。我正在尝试找到这个data.table
中的唯一标识符(换句话说,key
)。我正在寻找类似于Stata中的isid的东西,它可以检查指定的变量是否唯一地标识观测值。有人能帮忙吗?
data.table
。我正在尝试找到这个data.table
中的唯一标识符(换句话说,key
)。我认为你对于 data.table
和 key
的几个要点有些困惑。
data.table
才会有一个 key。data.table
的 key 不一定是唯一的。你可以编写一个函数来检查某些列是否可以创建数据集的唯一标识符。
在这里,我使用了 data.table,并小心地在未键控的数据表副本上使用了 unique
。
这是 不 高效的。
isid <- function(columns, data, verbose = TRUE){
if(!is.data.table(data)){
copyd <- data.table(data)
} else{
copyd <- copy(data)
}
if(haskey(copyd)){
setkey(copyd, NULL)
}
# NA values don't work in keys for data.tables
any.NA <- Filter(columns, f= function(x) any(is.na(copyd[[x]])))
if(verbose){
for(aa in seq_along(any.NA)){message(sprintf('Column %s contains NA values', any.NA[aa] ))}
}
validCols <- setdiff(columns, any.NA)
# cycle through columns 1 at a time
ncol <- 1L
validKey <- FALSE
while(!isTRUE(validKey) && ncol <= length(validCols)){
anyValid <- combn(x = validCols, m = ncol, FUN = function(xn){
subd <- copyd[, ..xn]
result <- nrow(subd) == nrow(unique(subd))
list(cols = xn, valid = result)
}, simplify = FALSE)
whichValid <- sapply(anyValid, `[[`, 'valid')
validKey <- any(whichValid)
ncol <- ncol + 1L
}
if(!validKey){
warning('No combinations are unique')
return(NULL)} else {
valid.combinations <- lapply(anyValid, `[[`, 'cols')[whichValid]
if(length(valid.combinations) > 1){
warning('More than one combination valid, returning the first only')
}
return(valid.combinations[[1]])
}
}
oneU <- data.table(a = c(2,1,2,2), b = c(1,2,3,4))
twoU <- data.table(a = 1:4, b = letters[1:4])
bothU <- data.table(a = letters[1:2], b = rep(letters[1:2], each = 2))
someNA <- data.table(a = c(1,2,3,NA), b = 1:4)
isid(names(oneU), oneU)
# [1] "b"
isid(names(twoU), twoU)
# [1] "a"
# Warning message:
# In isid(names(twoU), twoU) :
# More than one combination valid, returning the first only
isid(names(bothU), bothU)
# [1] "a" "b"
isid(names(someNA), someNA)
# Column a contains NA values
# [1] "b"
# examples with no valid identifiers
isid('a', someNA)
## Column a contains NA values
## NULL
## Warning message:
## In isid("a", someNA) : No combinations are unique
isid('a', oneU)
## NULL
## Warning message:
## In isid("a", oneU) : No combinations are unique
这并没有完全回答OP的问题[我还没有使用过data.table
],但它会帮助只使用R
的用户来回答OP的问题。我的重点将是解释isid
在Stata
上实际是如何工作的。我使用R
数据库中的数据(您需要安装optmatch
才能获取此数据)。
library(optmatch)
data(nuclearplants)
sample<-nuclearplants
我的重点仅集中在数据框的子集上,因为我的目标仅是解释 isid
是如何运作的:
sample<-sample[,c(1,2,5,10)]
head(sample,5)
cost date cap cum.n
H 460.05 68.58 687 14
I 452.99 67.33 1065 1
A 443.22 67.33 1065 1
J 652.32 68.00 1065 12
B 642.23 68.00 1065 12
Stata
命令isid cost
时,它没有显示任何内容,这意味着成本上没有重复的观察值(用于此的R
命令是unique(sample$cost)
或sample[duplicated(sample),]
)。[1] cost date cap cum.n
<0 rows> (or 0-length row.names).)
然而,当我们使用isid date
即在日期变量上时,Stata
会报告它不是唯一的。或者,如果您运行duplicates date examples
,Stata
将给出如下的重复观测:
. duplicates example date
Duplicates in terms of date
+-------------------------------+
| group: # e.g. obs date |
|-------------------------------|
| 1 2 27 67.25 |
| 2 2 2 67.33 |
| 3 3 29 67.83 |
| 4 2 4 68 |
| 5 5 8 68.42 |
|-------------------------------|
| 6 2 1 68.58 |
| 7 2 12 68.75 |
| 8 3 14 68.92 |
+-------------------------------+
#
所示)。第一个观察值对应于行 27(对于第二个重复的 67.25 没有给出行号)。Group
列显示每个重复观察值的唯一标识符。R command for the same is duplicated(sample$date).
duplicated(sample$date)
[1] FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE TRUE
[22] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
To identify the unique observation we can also use unique(sample$date) in R.
我们同样可以对两个变量 isid cost date
进行操作。同样地,Stata
无法识别跨两个变量的重复观测值。在 R
中使用 unique(sample[,c(1,2)]
时也是如此。
如果我在所有四个变量上运行 isid
,那么 Stata
就会说它是唯一的(没有警告)。
duplicates example cost date cap cum_n
Duplicates in terms of cost date cap cum_n
(0 observations are duplicates)
与R
中的unique(sample)
相同。
结论:因此,我认为只要一个变量是唯一的(即它没有重复的观测值),包括该唯一变量的变量组合应始终是唯一的。如果我错了,请纠正我。
isid
的详细示例。请注意,isid
并不是真正的基础命令,而是一个方便的命令。我们可以使用 bysort cost : assert _N == 1
命令来进行静默检查(返回代码 _rc
为 0),或者使用 bysort date: assert _N == 1
命令来得到一个错误信息(返回代码为 9)。 - Nick Cox
isid
属性的信息不足,我们无法多加评论。此外,您需要澄清您是使用了贡献的 data.table 包还是只是对data.frame
的适当术语感到困惑。 - IRTFMisid var1 var2
检查var1和var2是否在数据集中形成键。我正在寻找类似于R的东西。给定一个具有许多变量的数据集,我只想断言键是我认为的那样。 - user2012406all(key(DT) %in% c("var1", "var2")
- Arunisid
允许测试一个或多个变量是否作为标识符单独或联合使用。然而,原始问题是关于唯一标识符的(我强调)。与您之前的问题一样,我认为如果更加强调您想要解决的确切问题,而不是如何在Stata中实现它,您将从R人员那里获得更好的帮助。我对Stata感到乐观;我只是认为精通R和Stata的人群比流利的R用户池要小得多。 - Nick Cox