通过引用现有列的名称将新列添加到数据框

时间:2017-11-21 22:59:51

标签: r string dataframe dplyr tidyverse

我有这种形式的数据框:

df <- data.frame(abc = c(1, 0, 3, 2, 0), 
                 foo = c(0, 4, 2, 1, 0),
                 glorx = c(0, 0, 0, 1, 2))

这里,列名是字符串,数据框中的值是我想在新数据列中连接该字符串的次数。我想要创建的新列将是所有现有列的串联,每个列名都会根据数据重复。

例如,我想创建这个新列并将其添加到数据框中。

new_col <- c('abc', 'foofoofoofoo', 'abcabcabcfoofoo', 'abcabcfooglorx', 'glorxglorx')
also_acceptable <- c('abc', 'foofoofoofoo', 'abcfooabcfooabc', 'abcfooglorxabc', 'glorxglorx')

df %>% mutate(new_col = new_col, also_acceptable = also_acceptable)

连接顺序无关紧要。我遇到的核心问题是,在构造purrr::map()dplyr::mutate()函数来构建新列时,我不知道如何逐行引用名称。因此,我不确定如何以编程方式构建这个新专栏。

(这里的核心应用是化学式的组合构造,以防有人想知道为什么我需要这样的东西。)

1 个答案:

答案 0 :(得分:2)

以下是使用Mapstrrep的选项:

mutate(df, new_col = do.call(paste, c(sep="", Map(strrep, names(df), df))))

#  abc foo glorx         new_col
#1   1   0     0             abc
#2   0   4     0    foofoofoofoo
#3   3   2     0 abcabcabcfoofoo
#4   2   1     1  abcabcfooglorx
#5   0   0     2      glorxglorx

或更简单的版本@ thelatemail的评论:

df %>% mutate(new_col = do.call(paste0, Map(strrep, names(.), .)))

Map给出如下列表:

Map(strrep, names(df), df) %>% as.tibble()

# A tibble: 5 x 3
#        abc          foo      glorx
#      <chr>        <chr>      <chr>
#1       abc                        
#2           foofoofoofoo           
#3 abcabcabc       foofoo           
#4    abcabc          foo      glorx
#5                        glorxglorx

使用do.call(paste, ...)逐行粘贴字符串。