【问题标题】:R - concatenate multiple rows into one beside each otherR - 将多行并排连接成一行
【发布时间】:2026-02-07 11:40:01
【问题描述】:

我有一个包含 3 列和多行的数据框。我想拆分数据框,以便只有一行并且值是按顺序排列的(所以本质上是单行 csv)。

我的数据框如下所示:

  **Subject    Module        ID**
    History    WW2           1
    English    Literature    2
    Maths      Algebra       3

我想要实现的是一行看起来像这样并按以下顺序:

 History,    WW2,     1,     English,     Literature,    2,     Maths,    Algebra,    3 

我可以使用 excel 进行剪切和粘贴,但想知道是否有使用 R 的快速方法。

任何帮助都会很棒! 谢谢。

【问题讨论】:

    标签: r excel split concatenation


    【解决方案1】:

    使用pastecollapse 来执行此操作。 unlist 从您的数据帧中创建一个向量,但它是按列进行的,因此您需要先使用 t 来转置它。

    df <- read.table(textConnection("Subject    Module        ID
        History    WW2           1
                                    English    Literature    2
                                    Maths      Algebra       3"),
                     stringsAsFactors=FALSE, header=TRUE)
    > paste(unlist(t(df)), collapse=",")
    [1] "History,WW2,1,English,Literature,2,Maths,Algebra,3"
    

    已编辑以添加您在评论中要求的数据框版本...

    df1 <- read.csv(text=paste(unlist(t(df)), collapse=","), header=FALSE,
                    stringsAsFactors=FALSE)
    names(df1) <- rep(names(df), nrow(df))
    > df1
      Subject Module ID Subject     Module ID Subject  Module ID
    1 History    WW2  1 English Literature  2   Maths Algebra  3
    

    这会导致列名不唯一,这并不可取。

    【讨论】:

    • 是否有一种方法可以重复列名,然后将其保存为数据框而不是向量?感谢您的帮助
    • 谢谢@cory,我最终从你的第一个答案中得到了我需要的东西,并在答案有效时将我的问题编辑为原始问题。
    【解决方案2】:
    data<-data.frame(A=c(1:3),B=6:8,C=9:11)
    data
    #    A B  C
    # 1  1 6  9
    # 2  2 7 10
    # 3  3 8 11
    
    paste(colnames(data),unlist(t(data)),collapse=",")
    # [1] "A 1,B 6,C 9,A 2,B 7,C 10,A 3,B 8,C 11"
    

    希望这可能会有所帮助。

    【讨论】:

      【解决方案3】:

      如果你想保留标题,你可以试试这个:

        df <- read.table(textConnection("
      
                                    Subject    Module        ID
                                    History    WW2           1
                                    English    Literature    2
                                    Maths      Algebra       3"),stringsAsFactors=FALSE, header=TRUE)
      
       data.frame(t(unlist(df)))
      
       Subject1 Subject2 Subject3 Module1    Module2 Module3 ID1 ID2 ID3
      1  History  English    Maths     WW2 Literature Algebra   1   2   3
      

      【讨论】: