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

创建多个新列的条件是在R中使用已修改名称的前一列的值

  •  0
  • melbez  · 技术社区  · 5 年前

    dog_c  cat_c  cheese_c  hat_c 
    3      4      3         2
    3      1      2         5
    5      2      1         4 
    

    我想创建一个如下所示的数据帧。我想将原始数据框中给定列中的所有值平方,然后创建一个与原始列相同但结尾有2的列名。然后我想将它附加到原始数据帧。

    dog_c  cat_c  cheese_c  hat_c  dog_c2  cat_c2  cheese_c2  hat_c2 
    3      4      3         2      9       16      9          4
    3      1      2         5      9       1       2          5
    5      2      1         4      25      4       1          16
    

    df$dog_c2 <- (df$dog_c)^2
    

    有人建议我怎样才能更有效地做到这一点吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Ronak Shah    5 年前

    您也可以直接对dataframe执行相同的操作:

    df[paste0(names(df), 2)] <- df^2
    df
    
    #  dog_c cat_c cheese_c hat_c dog_c2 cat_c2 cheese_c2 hat_c2
    #1     3     4        3     2      9     16         9      4
    #2     3     1        2     5      9      1         4     25
    #3     5     2        1     4     25      4         1     16
    

    如果你想这样做 dplyr mutate_all

    library(dplyr)
    df %>% mutate_all(list(`2` = ~. ^2))
    

    如果只对选定列执行此操作,则可以执行以下操作:

    cols <- c('dog_c','cat_c') #Use regex if there are lot of columns.
    df[paste0(cols, 2)] <- df[cols]^2
    
    #  dog_c cat_c cheese_c hat_c dog_c2 cat_c2
    #1     3     4        3     2      9     16
    #2     3     1        2     5      9      1
    #3     5     2        1     4     25      4
    

    mutate_at 具有 dplyr公司

    df %>% mutate_at(cols, list(`2` = ~.^2))
    

    df <- structure(list(dog_c = c(3L, 3L, 5L), cat_c = c(4L, 1L, 2L), 
    cheese_c = 3:1, hat_c = c(2L, 5L, 4L)), class = "data.frame", 
    row.names = c(NA, -3L))
    
    推荐文章