在使用重塑之前,将NA分配给数据框内的重复值

时间:2016-07-29 07:23:26

标签: r

我想在使用NA之前将reshape分配给重复值,以避免在重新整形后在我的宽数据集中出现重复。在下面的示例数据框中,我想为我的数据集中的每个ID为X1和X2中的所有重复值分配NA,而不是X3。这意味着对于ID = 3,NA应该被分配给第4行中的X2,而对于ID = 4,这适用于第1行和第8行的X1,以及第6行和第8行的x2.X3的值应该是依然存在。我想分配NA,因为所有行都应保留在数据框中。

df <- read.table(header=TRUE,text = 
"ID X1  X2  X3
1   A   X   23
2   B   Y   4
3   A   X   32
3   B   X   6
4   A   Y   45
4   B   Y   7
4   A   Z   5
4   B   Z   3
         ")

  ID X1 X2 X3
1  1  A  X 23
2  2  B  Y  4
3  3  A  X 32
4  3  B  X  6
5  4  A  Y 45
6  4  B  Y  7
7  4  A  Z  5
8  4  B  Z  3

3 个答案:

答案 0 :(得分:4)

duplicated()对于识别重复项非常有用。

df[duplicated(df[c("ID", "X1")]), "X1"] = NA
df[duplicated(df[c("ID", "X2")]), "X2"] = NA

df
#   ID   X1   X2 X3
# 1  1    A    X 23
# 2  2    B    Y  4
# 3  3    A    X 32
# 4  3    B <NA>  6
# 5  4    A    Y 45
# 6  4    B <NA>  7
# 7  4 <NA>    Z  5
# 8  4 <NA> <NA>  3

答案 1 :(得分:1)

我们可以使用dplyr

library(dplyr)
df %>% 
  group_by(ID) %>% 
  mutate_each(funs(replace(., duplicated(.), NA)), X1:X2)
#      ID     X1     X2    X3
#   <int> <fctr> <fctr> <int>
#1     1      A      X    23
#2     2      B      Y     4
#3     3      A      X    32
#4     3      B     NA     6
#5     4      A      Y    45
#6     4      B     NA     7
#7     4     NA      Z     5
#8     4     NA     NA     3

答案 2 :(得分:0)

你可以尝试:

library(data.table)
setDT(df)
df[, c("X1","X2") := .(ifelse(duplicated(X1), NA, X1), ifelse(duplicated(X2), NA, X2)), by = ID]

结果:

    ID X1 X2 X3
1:  1  A  X 23
2:  2  B  Y  4
3:  3  A  X 32
4:  3  B NA  6
5:  4  A  Y 45
6:  4  B NA  7
7:  4 NA  Z  5
8:  4 NA NA  3