折叠 r 中的列以形成一列分隔字符串
Collapsing columns in r to form one column of delimited strings
我有一个数据框如下:
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")), class = "data.frame", row.names = c(NA,
-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,1,function(x) paste0(x,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, b, c, sep = ";")
# col1
#1 1;Tom;Wrist
#2 2;Jen;Ankle
#3 3;Rob;Neck
我有一个数据框如下:
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")), class = "data.frame", row.names = c(NA,
-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,1,function(x) paste0(x,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, b, c, sep = ";")
# col1
#1 1;Tom;Wrist
#2 2;Jen;Ankle
#3 3;Rob;Neck