【问题标题】:Add new column describing unique values per ID添加描述每个 ID 的唯一值的新列
【发布时间】:2016-02-24 23:38:56
【问题描述】:

我的数据包含四个字段: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=2 有两个观测值 x3 (2 "b"s)...因此,unqind=1

如果x3 的所有值都是NAs 每个ID,那么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

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用 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)
    })
    

    【讨论】:

    • 谢谢@Richard Scriven!
    猜你喜欢
    • 2015-09-03
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多