代码之家  ›  专栏  ›  技术社区  ›  Reid L

从特定行子集突变R中的列

  •  1
  • Reid L  · 技术社区  · 3 年前

    我正试图在数据帧中基于其他三列创建一个新列:父列、特定指示符列和组合的父特定指示符的值。

    给定:

      parent specific val
    1      a        x  10
    2      a        y  11
    3      a        z  12
    4      b        x  20
    5      b        y  21
    6      b        z  22
    7      c        x  30
    8      c        y  31
    9      c        z  32
    

    我想创建一个新列,比如px_val(选择每个父项的x值),这样得到的数据帧是:

      parent specific val px_val
    1      a        x  10     10
    2      a        y  11     10
    3      a        z  12     10
    4      b        x  20     20
    5      b        y  21     20
    6      b        z  22     20
    7      c        x  30     30
    8      c        y  31     30
    9      c        z  32     30
    

    测试代码df:

    df <- data.frame(
      parent=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'),
      specific=c('x', 'y', 'z', 'x', 'y', 'z', 'x', 'y', 'z'),
      val=c(10, 11, 12, 20, 21, 22, 30, 31, 32)
    )
    

    我想也许可以对数据帧进行迭代,将给定父级的x值存储在一个变量中,并将其分配给每个父级。但感觉必须有一个更优雅的解决方案?

    1 回复  |  直到 3 年前
        1
  •  0
  •   TarJae    3 年前

    我们可以这样做:

    px_val 将包含值,其中 specific 等于 x 对于每个唯一的父级-> val[specific == 'x']

    .by=... 组仅用于此突变,其优点是此后我们不需要unsup():

    library(dplyr) #>= dplyr 1.1.0
    
    df %>%
      mutate(px_val = val[specific == 'x'], .by=parent)
    
      parent specific val px_val
    1      a        x  10     10
    2      a        y  11     10
    3      a        z  12     10
    4      b        x  20     20
    5      b        y  21     20
    6      b        z  22     20
    7      c        x  30     30
    8      c        y  31     30
    9      c        z  32     30
    
    推荐文章