根据多个条件向列添加值

Adding values to columns based on multiple conditions

我有 1 df 如下

df <- data.frame(n1 = c(1,2,1,2,5,6,8,9,8,8),
                 n2 = c(100,1000,500,1,NA,NA,2,8,10,15),
                 n3 = c("a", "a", "a", NA, "b", "c",NA,NA,NA,NA),
                 n4 = c("red", "red", NA, NA, NA, NA,NA,NA,NA,NA))
df
  n1   n2   n3   n4
1  1  100    a  red
2  2 1000    a  red
3  1  500    a <NA>
4  2    1 <NA> <NA>
5  5   NA    b <NA>
6  6   NA    c <NA>
7  8    2 <NA> <NA>
8  9    8 <NA> <NA>
9  8   10 <NA> <NA>
9  8   15 <NA> <NA>

首先,请看我想要的输出

df
  n1   n2   n3   n4
1  1  100    a  red
2  2 1000    a  red
3  1  500    a  red
4  2    1 <NA>  red
5  5   NA    b <NA>
6  6   NA    c <NA>
7  8    2 <NA>  red
8  9    8 <NA> red
9  8   10 <NA> red
9  8   15 <NA> red

我在 () 之前做了这个 post。但是,我意识到我需要再写一篇专栏来解决我的问题。

所以,我想通过询问来自 n1n2、[=17= 的条件来 update/add n4 中的 red ].如果 n3 == "a",并且 n1 的值与 a 关联,则与 n1 的值在同一行的 n4 的值应添加红色(即 row 3,4th)。同时,如果n1的值也与n2的值匹配(即2),则n4的这一行也应该加上red.此外,n1 列的 8 与整个类似的事情有关。然后,如果我们有更多 n2n1 等于 8 的值,那么该步骤将像以前一样被复制。我希望它是清楚的,如果不是我想解释更多。 (听起来像 Zig Zag 的东西)。

-注意:tidyversebaseR也欢迎在这里帮助我。

请问有什么建议吗?

如果您使用的是igraph

,您可以尝试下面的代码
res <- do.call(
  rbind,
  lapply(
    decompose(
      graph_from_data_frame(replace(df, is.na(df), "NA"))
    ),
    function(x) {
      n4 <- E(x)$n4
      if (!all(n4 == "NA")) {
        E(x)$n4 <- unique(n4[n4 != "NA"])
      }
      get.data.frame(x)
    }
  )
)

dfout <- type.convert(
  res[match(do.call(paste, df[1:2]), do.call(paste, res[1:2])), ],
  as.is = TRUE
)

这给出了

> dfout
   from   to   n3   n4
1     1  100    a  red
2     2 1000    a  red
3     1  500    a  red
4     2    1 <NA>  red
9     5   NA    b <NA>
10    6   NA    c <NA>
5     8    2 <NA>  red
6     9    8 <NA>  red
7     8   10 <NA>  red
8     8   15 <NA>  red