用' NA'替换值在R中的ID

时间:2016-06-02 19:32:49

标签: r data-cleaning

我的数据看起来像这样

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'。

感谢您的帮助!

3 个答案:

答案 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")