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

R 粘贴数据帧而不更改为因子级别,r,dataframe,paste,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") 然后我把它换成这个,比方说df: df <- data.frame(a,b,c,d) 我的问题是: (1) 有人能给我解释一下为什么在df中它会把元素变成数字吗? (2) 是否有其他方法可以使用df获得输出(1)?这里是您使用的方法的替代方法:

我有向量,比如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")
然后我把它换成这个,比方说df:

df <- data.frame(a,b,c,d)
我的问题是: (1) 有人能给我解释一下为什么在df中它会把元素变成数字吗?
(2) 是否有其他方法可以使用df获得输出(1)?

这里是您使用的方法的替代方法:

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"

df_call您不能直接将
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
参数合并为“%”

paste
在其
参数上运行
as.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"

以下是一种
dplyr
方法:

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

do.call(paste, c(df, sep = "$", collapse = "%"))
# [1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"
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()