我有一个数据框,例如:
Names COL1 COL2 COL3 COL4
SP1 0 1 NaN LA
SP1 0 1 NaN LE
SP1 0 1 1 LI
SP2 1 0 0 LO
SP2 0 0 0 LU
SP3 1 1 NaN LY
SP3 1 1 NaN LZ
我想要每组Names
,替换每个 COL1
, COL2
和COL3
值0
或NaN
当列中的另一行等于 1
时.
例如在群组 SP1
中:
Names COL1 COL2 COL3 COL4
SP1 0 1 NaN LA
SP1 0 1 NaN LE
SP1 0 1 1 LI
正如您在 COL3
中看到的那样有两个NaN
,和一个1
值,所以因为至少有 1
值,我将这两个NaN
进行变换进入1
:
Names COL1 COL2 COL3 COL4
SP1 0 1 1 LA
SP1 0 1 1 LE
SP1 0 1 1 LI
同样适用于群组SP2
:
Names COL1 COL2 COL3 COL4
SP2 1 0 0 LO
SP2 0 0 0 LU
正如您在 COL1
中看到的那样有一个0
,和一个1
值,所以因为至少有 1
值,我变换0
进入1
:
Names COL1 COL2 COL3 COL4
SP2 1 0 0 LO
SP2 1 0 0 LU
最后我应该得到:
Names COL1 COL2 COL3 COL4
SP1 0 1 1 LA
SP1 0 1 1 LE
SP1 0 1 1 LI
SP2 1 0 0 LO
SP2 1 0 0 LU
SP3 1 1 NaN LY
SP3 1 1 NaN LZ
这是示例 df 的 dput 格式:
structure(list(Names = c("SP1", "SP1", "SP1", "SP2", "SP2", "SP3",
"SP3"), COL1 = c(0L, 0L, 0L, 1L, 0L, 1L, 1L), COL2 = c(1L, 1L,
1L, 0L, 0L, 1L, 1L), COL3 = c(NaN, NaN, 1, 0, 0, NaN, NaN), COL4 = c("LA",
"LE", "LI", "LO", "LU", "LY", "LZ")), class = "data.frame", row.names = c(NA,
-7L))
最佳答案
按“名称”分组后,使用 if/else
创建条件来执行替换
,即如果存在 1
%in%
列,将 NaN
或 0
替换为 1
library(dplyr)
df <- df %>%
group_by(Names) %>%
mutate(across(COL1:COL3, ~ if(1 %in% .x) replace(.x, is.nan(.x)|
.x %in% 0, 1) else .x)) %>%
ungroup
-输出
# A tibble: 7 × 5
Names COL1 COL2 COL3 COL4
<chr> <dbl> <dbl> <dbl> <chr>
1 SP1 0 1 1 LA
2 SP1 0 1 1 LE
3 SP1 0 1 1 LI
4 SP2 1 0 0 LO
5 SP2 1 0 0 LU
6 SP3 1 1 NaN LY
7 SP3 1 1 NaN LZ
关于如果组中的其他行等于 1,则替换 df 中的行 [R],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74434715/