添加描述每个ID的唯一值的新列

时间:2016-02-24 14:55:57

标签: r

我的数据包含四个字段:IDx1(数字),x2(数字)和x3(因子)。某些ID具有多个记录,并且还缺少x3的某些值(NA)。这是一个样本

ID <- c(1,1,1,1,2,2,3,3,3,3,4,4,4,5,6,6)
x1 <- rnorm(16,0,1)
x2 <- rnorm(16,2,2)
x3 <- c("a", "a", "a", NA, "b", "b", "c", "c", "a", "c", "w", "w", "w", "y", NA, NA)

df <- data.frame(ID, x1, x2, x3)

我想创建一个新字段(让我们称之为unqind)来检查每个ID是否具有唯一值x3

例如,ID=1有四个x3"a", "a", "a", NA)...三个“a”和一个NA的观察结果。因此unqind=0

ID=2x3(2“b”s)的两个观察结果......因此,unqind=1

如果x3的所有值均为每个ID NA,则unqind=1

创建unqind后,df看起来像:

ID          x1           x2  x3 unqind
 1   0.9087691    4.4353865   a      0
 1   0.3686852    2.5851186   a      0
 1   -1.335171      1.18109   a      0
 1  -0.1596629     0.593775  NA      0
 2   0.4841148    0.1684549   b      1
 2   0.1256352    4.2785666   b      1
 3   -0.954508    3.1284599   c      0
 3   0.3502183    2.4766285   c      0
 3  -1.2365438     1.041901   a      0
 3   0.9786498   -0.6517521   c      0
 4   1.3426399    1.5733424   w      1
 4  -0.3117586   -0.4648479   w      1
 4    0.136769   -2.6124866   w      1
 5  -1.3295984    6.2783164   y      1
 6  -1.1989125   -1.7025381  NA      1
 6  -0.8936165    2.3131387  NA      1

1 个答案:

答案 0 :(得分:2)

您可以使用 data.table 包轻松完成此操作。 uniqueN()相当于length(unique(x))但更快。按ID分组并将结果与​​1进行比较。

library(data.table)
setDT(df)[, unqind := as.integer(uniqueN(x3) == 1L), by = ID]

使用基数R的另一个选项可以是ave()

df$unqind <- with(df, {
  as.integer(ave(as.character(x3), ID, FUN=function(x) length(unique(x))) == 1L)
})