提问人:Parus major 提问时间:12/28/2022 最后编辑:Grasshopper_NZParus major 更新时间:12/30/2022 访问量:54
根据每个数据帧中使用的相同 ID 将零替换为 NA
Replace zeros with NAs based on same ID used in each dataframe
问:
我想根据 2 个不同数据帧中使用的相同 ID 标签将零替换为 NA。具体来说,我的第一个数据帧 (df1) 比第二个数据帧 (df2) 长,并且在“值”中显示一些零,必须通过匹配 ID(来自 df1)和 ID2(来自 df2)来替换为 Value2 (df2) 中的值。 我在下面列出了 2 个数据帧:
ID <- c("A1", "B1", "C1","D1","E1","F1","H1") # and more
Value<- c(0,3,0,7,10,15,0) # and more
df1 <- data.frame(ID, Value)
ID2<-c("A1","C1","H1")
Value2<-c(NA, NA, NA)
df2 <- data.frame(ID2, Value2)
我尝试了聚合和匹配等功能,但没有成功,任何帮助将不胜感激!
谢谢 米歇拉
答:
0赞
Grasshopper_NZ
12/28/2022
#1
此示例代码可能会有所帮助:
1. 创建示例数据集
library(tidyverse)
df1 <- data.frame(ID = c("A1", "B1", "C1","D1","E1","F1","H1"),
Value = c(0,0,0,7,10,15,0)) # note 1
df2 <- data.frame(ID = c("A1","C1","H1"),
Value = c(NA, NA, NA))
注 1:请注意,我已将 B1 从 3 更改为 0,以便稍后测试。
2. 仅当 df1 中的 ID 与 df2 的 ID 相对应时,才将 0 替换为 NA
df1 |>
mutate(Value = case_when(
ID %in% df2$ID ~ as.numeric(NA),
TRUE ~ Value
))
您将获得:
ID Value
1 A1 NA
2 B1 0 # note 2
3 C1 NA
4 D1 7
5 E1 10
6 F1 15
7 H1 NA
注 2:回想一下,B1 来自 df1 且为 0,只要 df1 的 ID 不在 df2 中,它们的值就会被保留,否则它们的值将更改为 NA。
希望这对您有所帮助。
评论
0赞
Parus major
12/29/2022
嗨,@Grasshopper_NZ,非常感谢您的反馈,但我有一个疑问:在数据帧 1 中,我可能有一些需要保持零的零:使用此代码,我将更改 NA 中的所有零,这不是我必须做的。
0赞
Grasshopper_NZ
12/29/2022
不用担心 - 您是否要保留 df1 中的一些 0,并将其余值替换为 df2 中的值?如果是这样,您能否指定在什么条件下需要保留 0?我会考虑如何实现这一目标。
0赞
Parus major
12/29/2022
我只需要将 0 替换为 NA,df1 中的 ID 对应于 df2 的 ID。我也尝试过这段代码: ID <- c(“A”, “B”, “C”,“C”, “D”,“E”,“F”,“G”,“H”,“I”,“L”,“M”,“N”) 值<- c(1, 0, 0, 0, 0, 0, 0,0,0,0,0,1, 1, 1, 0) df <- data.frame(ID, Value) ID2 <- c(“N”, “B”, “C”,“A”) Value2<- c(999,999,999,999) df2 <- data.frame(ID2, 值2)
0赞
Parus major
12/29/2022
只有当 df1 中的 ID 对应于 df2 的 ID 时,我才需要将 0 替换为 NA。在 df1 中,同一个 id 可以重复多次(所有这些都必须替换为 NA),我尝试使用 999 而不是 NA 来验证这段代码(最终稍后会更改它),但没有成功。
0赞
Grasshopper_NZ
12/30/2022
明白了,我想我有一个解决方案可以和你一起测试 - 现在会更新答案。
0赞
Parus major
12/30/2022
#2
我设法找到了一个解决方案:这就是我所做的。 我创建了一个 dataframe (df),其中包含一些必须替换的值:
ID <- c("A", "B", "C","C", "D","D","E","F","G","H","I","L","M","N")
Value<- c(1, 0, 0, 0, 0, 0,1, 1, 1, 0, 0, 1, 1, 0)
df <- data.frame(ID, Value)
df
我创建了第二个数据帧 (df2),其中包含要在 df 中替换为引用 ID 的值(此处为 NA):
ID <- c("N", "B", "C","A")
Value <-c(NA,NA,NA,NA)
df2<-data.frame(ID, Value)
df2
我使用了 并编码如下:library(data.table)
setDT(df)[df2, Value := i.Value , on =.(ID)]
> df
ID Value
1: A NA
2: B NA
3: C NA
4: C NA
5: D 0
6: D 0
7: E 1
8: F 1
9: G 1
10: H 0
11: I 0
12: L 1
13: M 1
14: N NA
评论