【问题标题】:Adding values to columns based on multiple conditions根据多个条件向列添加值
【发布时间】:2021-12-02 09:25:51
【问题描述】:

我有 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

我之前发过这篇文章 (Adding values to one columns based on conditions)。然而,我意识到我需要再写一篇专栏来解决我的问题。

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

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

请给我一些建议?

【问题讨论】:

  • 假设 'n1' 的第 9 行是 9,因为 9 连接到 8,那仍然应该是 'red' 吗?
  • @akrun 是的,这就是我想要的,因为它们就像管道一样
  • 那么,我猜它与igraph有关
  • 听说过,但老实说,我对igraph一无所知
  • 老实说,这是关于一棵大的系统发育树,而我在这里做的事情是找到代表植物类别的分支的颜色。我能做的唯一方法是使用findMRCA 函数找到common ancester,然后设置颜色。但是,由于树很大,似乎需要很长时间才能完全填充颜色,所以我想找到一种像我在这里发布的方法:)))

标签: r tidyverse igraph


【解决方案1】:

如果你使用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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多