我有这种形式的数据框:
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()
函数来构建新列时,我不知道如何逐行引用名称。因此,我不确定如何以编程方式构建这个新专栏。
(这里的核心应用是化学式的组合构造,以防有人想知道为什么我需要这样的东西。)
答案 0 :(得分:2)
以下是使用Map
和strrep
的选项:
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, ...)
逐行粘贴字符串。