【问题标题】:Copy a column and add a prefix to new column in R with dplyr使用 dplyr 复制一列并为 R 中的新列添加前缀
【发布时间】:2023-03-05 13:22:01
【问题描述】:

有人知道如何复制data.frame 中的列并为新列添加前缀吗?

我们的想法是拥有一个包含数据帧的某些列名的字符向量,并使用前缀复制这些列名,以便随后执行操作。

原因是我想在这些列上使用扩展函数,但据我所知,扩展函数不会保留原始列。我想要什么:

来自具有以下列名称的 data.frame:

column_names <- c('var1', 'var2', 'var3')

到具有以下列的数据框

column_names <- c('var1', 'var2', 'var3', 'prefix_var1','prefix_var3')

带有“前缀”的列包含与其原始列相同的数据。

到目前为止我已经尝试过,其中部分成功了:

sel_columns <- c('var1', 'var3')

data <- data.frame(var1 = c(12,3,4), var2 = c(123,5435,121), var3 = c(23,456,123))

new_data <- data %>% mutate_at(one_of(sel_columns), funs(.))
#Error in eval(substitute(expr), envir, enclos) : 
#  could not find function "var1"
#In addition: Warning message:
#In one_of(sel_columns) : Unknown variables: `var1`, `var3`


new_data2 <- data %>% select(one_of(sel_columns)) %>% mutate_all(funs(prefix = . * 1)) %>% c(data, .) %>% data.frame

【问题讨论】:

    标签: r copy dplyr multiple-columns prefix


    【解决方案1】:

    我们可以在base R试试这个

    cbind(data, setNames(data[sel_columns], paste0("prefix_", sel_columns)))
    
    #  var1 var2 var3 prefix_var1 prefix_var3
    #1   12  123   23          12          23
    #2    3 5435  456           3         456
    #3    4  121  123           4         123
    

    【讨论】:

    • 我发现它确实适用于我提供的示例,但是对于我自己的示例,它产生了一个包含两列的 data.frame,一个名为“data”,另一个名为“V2” '。我发现使用 c() 函数 cbind() 函数确实可以正常工作。
    • @Michael 我不确定可能是什么问题。可以发dput(head(data)) 让我们得到真正的数据集吗?
    • 如果您确实想添加 dplyr 风格:bind_cols(data, setNames(data[sel_columns], paste0("prefix_",sel_columns)))
    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    setDT(data)[, paste0("prefix_", sel_columns) := mget(sel_columns)][]
    #   var1 var2 var3 prefix_var1 prefix_var3
    #1:   12  123   23          12          23
    #2:    3 5435  456           3         456
    #3:    4  121  123           4         123
    

    .SDcols

    【讨论】:

      【解决方案3】:

      如果您真的想在dplyr 中执行此操作,您需要考虑使用dplyr 动词的标准评估版本。 @joel.wilson 有正确的想法,但如果您以编程方式执行此操作并使用管道,则 SE 版本是执行此操作的正确方法。

      data %>% 
        bind_cols(., select_(., .dots = setNames(sel_columns, sprintf("prefix_%s", sel_columns)))) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-18
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        相关资源
        最近更新 更多