在使用重塑之前,为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可以完美地工作