Комбинирование значений столбца с именами столбцов, используя tidyr объединиться


У меня есть data.frame с несколькими столбцами:

set.seed(1)
df <- data.frame(cluster=LETTERS[1:4],group=c(rep("m",2),rep("f",2)),point=rnorm(4),err=runif(4,0.1,0.3))

И я бы добавил еще одну колонку, которая "n" concatenates все столбцы соответствующей строки, где имя столбца предшествует значению.

Я знаю это:

library(tidyr)
library(dplyr)
tidyr::unite(df,text,sep="n")

Дает мне это tibble:

                                         text
1  Anmn0.487429052428485n0.286941046221182
2  Bnmn0.738324705129217n0.142428504256532
3  Cnfn0.575781351653492n0.230334753217176
4 Dnfn-0.305388387156356n0.125111019192263

Но я хочу вот чего tibble:

                                         text
1  cluster: Angroup: mnpoint: 0.487429052428485nerr: 0.286941046221182
2  cluster: Bngroup: mnpoint: 0.738324705129217nerr: 0.142428504256532
3  cluster: Cngroup: fnpoint: 0.575781351653492nerr: 0.230334753217176
4 cluster: Dngroup: fnpoint: -0.305388387156356nerr: 0.125111019192263

Есть идеи?

1 3

1 ответ:

Мы можем использовать Map с do.call

data.frame(text = do.call(paste, c(Map(function(x, y) 
                 paste(x, y, sep=": "), names(df), df), sep="\n")))

Или используя tidyverse, сопоставьте столбцы (imap - предоставляет .y в качестве имен столбцов), а затем выполните unite

library(tidyverse)
imap(df, ~ paste(.y, .x, sep=": ")) %>%
              as_tibble %>%
              unite(text, sep="\n")
# A tibble: 4 x 1
#  text                                                                     
#  <chr>                                                                    
#1 "cluster: A\ngroup: m\npoint: -0.626453810742332\nerr: 0.225822808779776"
#2 "cluster: B\ngroup: m\npoint: 0.183643324222082\nerr: 0.112357254093513" 
#3 "cluster: C\ngroup: f\npoint: -0.835628612410047\nerr: 0.14119491497986" 
#4 "cluster: D\ngroup: f\npoint: 1.59528080213779\nerr: 0.135311350505799"