我的数据看起来像这样
ID v1 v2
1 1 0
2 0 1
3 1 0
3 0 1
4 0 1
我想用' NA'替换所有值。如果ID在数据帧中出现多次。最终产品应如下所示
ID v1 v2
1 1 0
2 0 1
3 NA NA
3 NA NA
4 0 1
我可以手动执行此操作,但我希望R检测所有重复的案例(在这种情况下,ID是两次ID' 3')并将值替换为' NA'。
感谢您的帮助!
答案 0 :(得分:4)
您可以从任一端使用duplicated()
,然后替换。
idx <- duplicated(df$ID) | duplicated(df$ID, fromLast = TRUE)
df[idx, -1] <- NA
给出了
ID v1 v2 1 1 1 0 2 2 0 1 3 3 NA NA 4 3 NA NA 5 4 0 1
如果重复的ID不是彼此相邻,这也会有效。
数据:强>
df <- structure(list(ID = c(1L, 2L, 3L, 3L, 4L), v1 = c(1L, 0L, 1L,
0L, 0L), v2 = c(0L, 1L, 0L, 1L, 1L)), .Names = c("ID", "v1",
"v2"), class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:3)
还有一个选择:
df1[df1$ID %in% df1$ID[duplicated(df1$ID)], -1] <- NA
#> df1
# ID v1 v2
#1 1 1 0
#2 2 0 1
#3 3 NA NA
#4 3 NA NA
#5 4 0 1
数据强>
df1 <- structure(list(ID = c(1L, 2L, 3L, 3L, 4L), v1 = c(1L, 0L, 1L,
0L, 0L), v2 = c(0L, 1L, 0L, 1L, 1L)), .Names = c("ID", "v1",
"v2"), class = "data.frame", row.names = c(NA, -5L))
答案 2 :(得分:0)
这是基础R方法
# get list of repeated IDs
repeats <- rle(df$ID)$values[rle(df$ID)$lengths > 1]
# set the corresponding variables to NA
df[, -1] <- sapply(df[, -1], function(i) {i[df$ID %in% repeats] <- NA; i})
在第一行中,我们使用rle
来提取重复的ID。在第二个中,我们使用sapply
循环遍历非ID变量,并替换每个变量以NA重复的ID。
请注意,这假定数据集按ID排序。这可以通过order
函数来完成。 (df <- df[order(df$ID),]
)。
如果数据集非常大,您可以将第一个函数拆分为两个步骤,以避免计算rle
两次:
dfRle <- rle(df$ID)
repeats <- dfRle$values[dfRle$lengths > 1]
数据强>
df <- read.table(header=T, text="ID v1 v2
1 1 0
2 0 1
3 1 0
3 0 1
4 0 1")