我的数据包含四个字段:ID
,x1
(数字),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
的所有值均为每个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
答案 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)
})