代码之家  ›  专栏  ›  技术社区  ›  Vlad

使用另一个具有相同列命名选择的dataframe更改数据帧列的选择

  •  0
  • Vlad  · 技术社区  · 6 年前

    df2中所选列的名称与df1中的相同,而且两个数据帧的行数相同(id列相同)。

    在此代码中,请将“优雅函数”替换为优雅函数。列的选择是“a”和“b”。“ignore_me”列是两者中的id列,这可能会引诱您加入数据帧,但是请忽略它。

    df1 <- data.frame(ignore_me = 1:5, a = 1:5, b = 11:15)
    df2 <- data.frame(ignore_me = 1:5, a = c(0, 1, 1, 0, 2), b = c(1, 0, 1, 2, 0))
    
    fn <- function(x1, x2){
      if(x2 == 1){
        return(x1 - x2)
      }
      if(x2 == 2){
        return(x1 + x2)
      }
      x1
    }
    fn <- Vectorize(fn)
    
    df <- elegant_function(
      df1 
      , df2
      , c("a", "b")
      , fn
      )
    

    输出如下:

    > df
              ignore_me a b
    1         1         1 10
    2         2         1 12
    3         3         2 12
    4         4         4 16
    5         5         7 15
    

    以下是一个不优雅的方法:

    df <- df1 %>% select(ignore_me) %>%
      mutate(
        a = fn(df1$a, df2$a)
        , b = fn(df1$b, df2$b)
        )
    

    不优雅,因为每个选定的列都需要在mutate函数中有一个新行-如果所选列可以作为函数的输入字符串提供给函数,以便它可以在运行时变化,这将是一种优雅。

    在df1、df2中可能还有其他列也要忽略,我只将“ignore_me”列作为这些列的示例。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Onyambu    6 年前

    既然我们要忽略 ignore_me

    (-1)^df2 * df2 + df1
      ignore_me a  b
    1         0 1 10
    2         4 1 12
    3         0 2 12
    4         8 4 16
    5         0 7 15
    

    检查“忽略我”列之外的其他列

    更新:

    elegant_function <- function(dat1,dat2,colNames,FUN)
    {
      dat1[colNames] <- data.frame(Map(Vectorize(FUN),dat1[colNames],dat2[colNames]))
      dat1
    }
    elegant_function(df1, df2, c("a", "b"), fn)
    
     ignore_me a  b
    1         1 1 10
    2         2 1 12
    3         3 2 12
    4         4 4 16
    5         5 7 15