R data.table中的唯一标识符

R data.table中的唯一标识符,r,uniqueidentifier,data.table,stata,R,Uniqueidentifier,Data.table,Stata,我有一个包含11个变量和200000多行的data.table。我试图在这个数据表中找到唯一标识符(换句话说,键) 我正在寻找类似于Stata的东西,它检查指定的变量是否唯一地标识观测值。有人能帮忙吗?我想你对数据表和键的几点感到困惑 除非您显式设置键,否则data.table将不会有键 数据。表键不必是唯一的 您可以编写一个函数来检查某些列是否可以为数据集创建唯一标识符 我在这里使用了data.table,并注意在data.table的未加密副本上使用unique 这是没有效率的 isi

我有一个包含11个变量和200000多行的
data.table
。我试图在这个
数据表中找到
唯一标识符
(换句话说,


我正在寻找类似于Stata的东西,它检查指定的变量是否唯一地标识观测值。有人能帮忙吗?

我想你对
数据表和
键的几点感到困惑

  • 除非您显式设置键,否则
    data.table
    将不会有键
  • 数据。表
    键不必是唯一的
您可以编写一个函数来检查某些列是否可以为数据集创建唯一标识符

我在这里使用了data.table,并注意在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]])
   }
 }

isid这并不能准确回答OP的问题[我还没有使用
数据表
),但它只会帮助
R
用户回答OP的问题。我的重点将是解释
isid
实际上是如何处理
Stata
的。我使用
R
数据库中的数据(您需要为此数据安装
optmatch

现在,当我使用
Stata
命令
isid cost
时,它不会显示任何东西,这意味着没有对成本的重复观察(
R
命令,因为它是
unique(sample$cost)
sample[duplicated(sample),]

为了解释输出,这意味着观察67.25有两个重复的观察(如
#
所示)。第一个观察对应于第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成本日期
执行相同的操作。
Stata
同样不能识别两个变量之间的重复观测值。在
R
中使用
unique(样本[,c(1,2)]
时也是如此

同样,如果我在所有四个变量上运行
isid
,那么
Stata
表示它是唯一的(没有警告)

R
中的
unique(示例)
相同


结论:因此,我认为只要一个变量是唯一的(即它没有重复的观察值),包含唯一变量的变量组合应始终是唯一的。如果我错了,请纠正我。

行名在数据帧中必须是唯一的。您没有告诉我们有关Stata中的
isid
属性的更多信息。您还需要澄清您是否正在使用贡献的数据。table package or只是对
data.frame
@DWin的正确术语感到困惑-我没有把data.frame与data.table混淆。我使用的是package data.table。我希望有人了解R和Stata知识来回答这个问题。但由于您似乎不熟悉Stata,
isid var1 var2
检查var1和var2形成数据集中的键。我在R中寻找类似的东西。给定一个包含大量变量的数据集,我只想断言该键就是我所认为的。@Arun没有帮助。不过谢谢!@user2012406,在这种情况下,请执行:
all(key(DT)%in%c(“var1”,“var2”)
我相信您对数据中的“键”感到困惑。表对象是唯一标识符。user1493368给出了
isid
实际使用的详细示例。请注意
isid
并不是真正的基本命令。它是一个方便的命令。您可以通过排序成本:assert _N==1来获得默认同意(返回代码
\u rc
为0)或
按排序日期:assert _N==1
,将出现错误消息(返回代码为9)。
library(optmatch)
data(nuclearplants)
sample<-nuclearplants
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
[1] cost  date  cap   cum.n
<0 rows> (or 0-length row.names).)
. 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 |
  +-------------------------------+
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. 
duplicates example  cost date cap cum_n

Duplicates in terms of cost date cap cum_n

(0 observations are duplicates)