粘贴数据框而不更改为因子级别

时间:2018-05-23 01:25:15

标签: r dataframe paste

我有矢量让a,b,c,d如下:

 a <- c(1,2,3,4)
 b <- c("L","L","F","L")
 c <- c(11,22,33,44)
 d <- c("Y", "N", "Y","Y")

我尝试使用粘贴来获得此输出(1):

paste(a,b,c,d, sep = "$", collapse = "%")
[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

然后我将其更改为此,请说df:

df <- data.frame(a,b,c,d)

并获得此输出(2):

paste(df, sep = "$", collapse = "%")
[1] "c(1, 2, 3, 4)%c(2, 2, 1, 2)%c(11, 22, 33, 44)%c(2, 1, 2, 2)"

我的问题是: (1)有人可以向我解释为什么在df中将其元素更改为数字? (2)有没有其他方法可以使用df来获得输出(1)?

4 个答案:

答案 0 :(得分:4)

pasteas.character个参数上运行...(或内部类似的东西),有效地删除了列表。看看

as.character(df)
# [1] "c(1, 2, 3, 4)"     "c(2, 2, 1, 2)"     "c(11, 22, 33, 44)" "c(2, 1, 2, 2)"    
deparse(df$a)
# [1] "c(1, 2, 3, 4)"

您的代码将这些值粘贴在一起。要解决此问题,您可以使用do.call

do.call(paste, c(df, sep = "$", collapse = "%"))
# [1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

答案 1 :(得分:3)

以下是您使用的方法的替代方法:

df_call <- c(df, sep="$")
paste(do.call(paste, df_call), collapse="%")

[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

Demo

答案 2 :(得分:2)

您无法在此处直接将paste应用于您的案例的数据框,以获得在两个级别应用paste所需的所需输出。

paste(apply(df, 1, function(x) paste(x, collapse = "$")), collapse = "%")

#[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

apply命令创建行向量

的位置
apply(df, 1, function(x) paste(x, collapse = "$"))
#[1] "1$L$11$Y" "2$L$22$N" "3$F$33$Y" "4$L$44$Y"

并且下一个paste命令将这些与collapse参数合并为“%”。

答案 3 :(得分:0)

这是dplyr方法:

pull(summarise(unite(df, tmp, 1:ncol(df), sep="$"), paste(tmp, collapse="%")))

或者:

df %>%
  unite(tmp, 1:ncol(df),sep="$") %>%
  summarise(output = paste(tmp, collapse="%")) %>%
  pull()