根据每个数据帧中使用的相同 ID 将零替换为 NA

Replace zeros with NAs based on same ID used in each dataframe

提问人:Parus major 提问时间:12/28/2022 最后编辑:Grasshopper_NZParus major 更新时间:12/30/2022 访问量:54

问:

我想根据 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)

我尝试了聚合和匹配等功能,但没有成功,任何帮助将不胜感激!

谢谢 米歇拉

r 数据帧 替换 匹配

评论


答:

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