【问题标题】:Combining column values with column names using tidyr unite使用 tidyr unity 将列值与列名组合
【发布时间】:2018-07-02 16:46:15
【问题描述】:

我有一个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  A\nm\n0.487429052428485\n0.286941046221182
2  B\nm\n0.738324705129217\n0.142428504256532
3  C\nf\n0.575781351653492\n0.230334753217176
4 D\nf\n-0.305388387156356\n0.125111019192263

但我想要的是这个tibble:

                                         text
1  cluster: A\ngroup: m\npoint: 0.487429052428485\nerr: 0.286941046221182
2  cluster: B\ngroup: m\npoint: 0.738324705129217\nerr: 0.142428504256532
3  cluster: C\ngroup: f\npoint: 0.575781351653492\nerr: 0.230334753217176
4 cluster: D\ngroup: f\npoint: -0.305388387156356\nerr: 0.125111019192263

有什么想法吗?

【问题讨论】:

    标签: r tidyr tibble


    【解决方案1】:

    我们可以使用Mapdo.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"  
    

    或者正如@DanChaltiel 提到的那样

    imap_dfr(df, ~ paste(.y, .x, sep = "; ")) %>%
          unite(text, sep = "\n")
    

    【讨论】:

    • 我们也可以使用aggregate(do.call(paste,c(sep=" :",rev(stack(df)))),list(c(row(df))),paste,collapse="\n")避免循环
    • @Onyambu 是的,但是如果您检查这些功能,它会执行aggregatestack 等,这将是更多开销
    • 您甚至可以使用imap_dfr() 并删除as_tibble 来保存通话。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多