在使用重塑之前,为dataframe中的重复值指定NA

在使用重塑之前,为dataframe中的重复值指定NA,r,R,我想在使用重塑之前将NA分配给一个重复值,以避免重塑后在我的宽数据集中重复。在下面的示例数据框中,我想为数据集中的每个ID将NA分配给X1和X2中的所有重复值,而不是X3中的所有重复值。这意味着对于ID=3,NA应分配给第4行的X2,对于ID=4,这适用于第6行和第8行的X1,也适用于第6行和第8行的X2。X3的值应保持不变。我想分配NA,因为所有行都应该保留在数据框中 df <- read.table(header=TRUE,text = "ID X1 X2 X3 1 A

我想在使用
重塑
之前将
NA
分配给一个重复值,以避免重塑后在我的宽数据集中重复。在下面的示例数据框中,我想为数据集中的每个ID将NA分配给X1和X2中的所有重复值,而不是X3中的所有重复值。这意味着对于ID=3,
NA
应分配给第4行的X2,对于ID=4,这适用于第6行和第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
df您可以尝试:

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
你可以试试:

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
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
df[duplicated(df[c(“ID”,“X1”)]),“X1”]=NA
df[duplicated(df[c(“ID”,“X2”)]),“X2”]=NA
df
#ID X1 X2 X3
#1 X 23
#2 B Y 4
#3 X 32
#4 3 B 6
#5 4 A Y 45
#6 4 B 7
#7 4 Z 5
# 8  4    3
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
df[duplicated(df[c(“ID”,“X1”)]),“X1”]=NA
df[duplicated(df[c(“ID”,“X2”)]),“X2”]=NA
df
#ID X1 X2 X3
#1 X 23
#2 B Y 4
#3 X 32
#4 3 B 6
#5 4 A Y 45
#6 4 B 7
#7 4 Z 5
# 8  4    3

我们可以使用
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
库(dplyr)
df%>%
分组依据(ID)%>%
每个(funs(替换(、复制(、NA)),X1:X2)突变
#ID X1 X2 X3
#      
#1 X 23
#2 B Y 4
#3 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 3

我们可以使用
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
库(dplyr)
df%>%
分组依据(ID)%>%
每个(funs(替换(、复制(、NA)),X1:X2)突变
#ID X1 X2 X3
#      
#1 X 23
#2 B Y 4
#3 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 3

聪明地将ID包含在重复的
呼叫中,谢谢!我开始写一个
ifelse
答案,但觉得应该有一种方法来避免“分组”解决方案。然后我意识到我可以直接更换。谢谢你的回答!关于括号有一个小错误。将语法更改为
df[duplicated(df[c(“ID”,“X1”)]),“X1”]=NA
后,使用
is.naClever将ID包含在
duplicated
调用中,效果非常好谢谢!我开始写一个
ifelse
答案,但觉得应该有一种方法来避免“分组”解决方案。然后我意识到我可以直接更换。谢谢你的回答!关于括号有一个小错误。将语法更改为
df[duplicated(df[c(“ID”,“X1”)]),“X1”]=NA
后,使用
is.NA可以完美地工作