使r中的列折叠以形成一列定界字符串

问题描述

我的数据框如下:

df <- structure(list(a = c("1","2","3"),b = c("Tom","Jen","Rob"
),c = c("Wrist","Ankle","Neck")),class = "data.frame",row.names = c(NA,-3L))

我正在尝试将我的列折叠为一列,其中每一行包含一个单个文本字符串,该字符串由每列中的数据组成,并由定界符(特别是; [冒号])分隔。

我当前的代码将我的数据转换为文本字符串,但它不是一个多行,而是一个包含数据框中所有数据的单元格:

data.frame(format_delim(df[1:nrow(df),],";",append = FALSE,col_names = FALSE,quote_escape = FALSE))

我应该怎么做才能获得以下数据帧?

structure(list(c..1.Tom.Wrist....2.Jen.Ankle....3.Rob.Neck.. = c("1;Tom;Wrist","2;Jen;Ankle","3;Rob;Neck")),-3L))

谢谢。希望这很容易理解。

解决方法

尝试此apply()解决方案:

#Code
out <- data.frame(v1=apply(df,1,function(x) paste0(x,collapse = ';')))

输出:

           v1
1 1;Tom;Wrist
2 2;Jen;Ankle
3  3;Rob;Neck

如果要将新变量添加到原始df中,可以使用以下方法:

#Code
df$var <- apply(df,collapse = ';')) 

输出:

  a   b     c         var
1 1 Tom Wrist 1;Tom;Wrist
2 2 Jen Ankle 2;Jen;Ankle
3 3 Rob  Neck  3;Rob;Neck
,

我们可以对do.call使用向量化选项

data.frame(col1 = do.call(paste,c(df,sep=";")))
#     col1
#1 1;Tom;Wrist
#2 2;Jen;Ankle
#3  3;Rob;Neck

或者如果只有几列,我们可以使用

with(df,paste(a,b,c,sep=";"))

或者另一个选择是unite

library(tidyr)
library(dplyr)
df %>%
    unite(col1,a,sep = ";")
#       col1
#1 1;Tom;Wrist
#2 2;Jen;Ankle
#3  3;Rob;Neck