gpt4 book ai didi

用 NA 替换所有零列

转载 作者:行者123 更新时间:2023-12-04 10:44:13 25 4
gpt4 key购买 nike

我在 R 中有以下数据框

library(dplyr)
library(tidyr)

df= data.frame("ID"= c("A", "A", "A", "A", "B", "B", "B"),
"A1"= c(0,0, 0, 0, 1,0,1), "B1"= c(1,0, 1,0, 0, 0, 0))

数据框如下所示

  ID A1 B1
1 A 0 1
2 A 0 0
3 A 0 1
4 A 0 0
5 B 1 0
6 B 0 0
7 B 1 0

我想获取以下数据框

   ID A1 B1
1 A NA 1
2 A NA 0
3 A NA 1
4 A NA 0
5 B 1 NA
6 B 0 NA
7 B 1 NA

我试过下面的代码

df%>%group_by(ID)%>%
mutate(A1=case_when(sum(A1)==0~NA))%>%
mutate(B1=case_when(sum(B1)==0~NA))

这会将 A1 和 B1 完全转换为 NA 值。

我在这里请求一些帮助。

最佳答案

我们可以group_by ID 并使用mutate_all with replace

library(dplyr)

df %>%
group_by(ID) %>%
mutate_all(~replace(., all(. == 0), NA))

# ID A1 B1
# <fct> <dbl> <dbl>
#1 A NA 1
#2 A NA 0
#3 A NA 1
#4 A NA 0
#5 B 1 NA
#6 B 0 NA
#7 B 1 NA

如果还有其他列并且我们只想将其应用于特定列,我们可以使用 mutate_at

df %>%
group_by(ID) %>%
mutate_at(vars(A1,B1), ~replace(., all(. == 0), NA))

使用 case_when 我们可以这样做

df %>%
group_by(ID) %>%
mutate_all(~case_when(all(. == 0) ~ NA_real_, TRUE ~ .))

OP 尝试的问题是 case_when 中没有定义 TRUE 案例,因此当没有条件匹配时,它默认返回 NA。来自 ?case_when

If no cases match, NA is returned.

因此,如果我们定义 TRUE 情况,它将按预期工作。此外,我们不应检查 sum(A1)==0,因为如果列中有负值和正值(如 -2 、+2),它们加起来会为 0,从而产生意想不到的结果。

df%>%
group_by(ID) %>%
mutate(A1 = case_when(all(A1 == 0) ~ NA_real_, TRUE ~ A1),
B1 = case_when(all(B1 == 0) ~ NA_real_, TRUE ~ B1))

关于用 NA 替换所有零列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56729816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com