如果组中的其他行等于 1,则替换 df 中的行 [R]

标签 r dplyr

我有一个数据框,例如:

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 , COL2COL30NaN当列中的另一行等于 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% 列,将 NaN0 替换为 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/

相关文章:

r - 如果满足条件,则减去数据框中的两列

regex - 计算字符串中的模式匹配数

r - 按 R 中其他列中的条件选择的一列获取唯一行

r - 使用dplyr时使用rle按运行分组

r - 如何将一列示例 ID 映射到其各自的文件名

r - 识别 r 中的重复

Windows 上的 R : character encoding hell

r - Integer64 类无法在 reshape2 熔体函数中幸存

r - 为数据创建 5 秒的间隔并将它们分组

R:确定每个日期间隔是否与数据框中的所有其他日期间隔重叠