R 连接数据帧的行

R 连接数据帧的行,r,vector,concatenation,paste,r-factor,R,Vector,Concatenation,Paste,R Factor,我想获取一个包含字符和数字的数据帧,并将每行的所有元素连接到一个字符串中,该字符串将作为单个元素存储在向量中。例如,我创建了一个由字母和数字组成的数据帧,然后我想通过粘贴函数连接第一行,并希望返回值“A1” 所以,如果它不是一个向量,那么它的行为异常是有意义的,但我不能强迫它成为一个向量 > is.vector(as.vector(df[1,])) [1] FALSE 使用作为.character似乎对我的尝试没有帮助 有人能解释这种行为吗?这确实有点奇怪,但这也是应该发生的事情。 当您

我想获取一个包含字符和数字的数据帧,并将每行的所有元素连接到一个字符串中,该字符串将作为单个元素存储在向量中。例如,我创建了一个由字母和数字组成的数据帧,然后我想通过粘贴函数连接第一行,并希望返回值“A1”

所以,如果它不是一个向量,那么它的行为异常是有意义的,但我不能强迫它成为一个向量

> is.vector(as.vector(df[1,]))
[1] FALSE
使用
作为.character
似乎对我的尝试没有帮助


有人能解释这种行为吗?

这确实有点奇怪,但这也是应该发生的事情。 当您创建
data.frame
时,列
字母
存储为
因子
。自然,因子没有顺序,因此当
as.numeric()
应用于因子时,它返回因子的顺序。例如:

> df[, 1]
[1] A B C D E
Levels: A B C D E
> as.numeric(df[, 1])
[1] 1 2 3 4 5
A
是系数
df[,1]
的第一级,因此当应用
as.numeric
时,
A
转换为值
1
。这就是调用粘贴(df[1,])时发生的情况。因为列1和列2属于不同的类,所以“粘贴”首先将行1的两个元素转换为数字,然后再转换为字符

如果要连接两列,首先需要将第一行转换为字符:

df[, 1] <- as.character(df[, 1])
paste(df[1,], collapse = "")

df[,1]当其他人关注代码不起作用的原因以及如何改进代码时,我将尝试更多地关注您想要的结果。根据您的描述,似乎您可以使用粘贴轻松实现所需:

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5, stringsAsFactors=FALSE)
paste(df$letters, df$numbers, sep=""))

## [1] "A1" "B2" "C3" "D4" "E5"
编辑:替代方法和说明: 我意识到,您遇到的问题是,您使用的是一个因子,而您使用的是
sep
参数,而不是
collapse
(正如@adibender所指出的)。不同之处在于,
sep
给出了两个独立向量之间的分隔符,
collapse
给出了向量内的分隔符。当使用
df[1,]
时,为
粘贴提供一个向量,因此必须使用
折叠
参数。使用您获取每一行并将其串联的想法,以下代码行将完全满足您的要求:

apply(df, 1, paste, collapse="")
好,现在来解释一下:

为什么
as.list
不起作用?

as.list
将对象转换为列表。所以它确实有效。它会将数据帧转换为列表,然后忽略
sep=“”
参数<代码>c
将对象组合在一起。从技术上讲,数据帧只是一个列表,其中每个列都是一个元素,所有元素必须具有相同的长度。因此,当我将其与
sep=”“
组合时,它只是成为一个常规列表,其中dataframe的列作为元素

为什么使用
do.call

do.call
允许您使用命名列表作为参数调用函数。您不能直接将列表放入粘贴中,因为它不喜欢数据帧。它是为连接向量而设计的。因此请记住,
dfargs
是一个包含字母向量、数字向量和sep的列表,sep是一个仅包含“”的长度为1的向量。当我使用
do.call
时,产生的粘贴功能本质上是
粘贴(字母、数字、sep)

但是,如果我的原始数据帧有
“字母”、“数字”、“squigs”、“blargs”
列,然后我像以前一样添加了分隔符,该怎么办?然后,通过
do.call
执行的粘贴函数如下所示:

paste(letters, numbers, squigs, blargs, sep)
因此,您可以看到它适用于任意数量的列。

对于使用library(tidyverse)的用户,您只需使用unite函数即可

 new.df<-df%>%
 unite(together, letters, numbers, sep="")
new.df%
联合(一起,字母,数字,sep=“”)

这将为您提供一个名为“together”的新列,其中包含A1、B2等

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5, stringsAsFactors=TRUE)
它没有任何逻辑,除非一旦你了解了每个函数的内部结构,它可能会有意义

 new.df<-df%>%
 unite(together, letters, numbers, sep="")
当参数转换为向量时,因子似乎转换为整数(如您所知,数据帧是长度相等的向量列表,因此数据帧的第一行也是一个列表,当强制将其转换为向量时,会发生如下情况:)

我不知道
apply
如何实现它的功能(即,因子由字符值表示)——如果您感兴趣,请查看它的源代码。不过,知道您可以信任(在这个特定的意义上)
应用(在这个特定的场合)可能会很有用。更一般地说,以合理的格式存储每段数据是有用的,包括将字符串存储为字符串,即使用
stringsAsFactors=FALSE


顺便说一句,每本介绍R的书都应该在副标题中有这个想法。例如,我的退休计划是写一篇“用R,stringsAsFactors=FALSE的方式(不是那么)温和地介绍数据渔业的禅宗”。

你是否尝试过在你的data.frame创建中添加
stringsAsFactors=FALSE
参数?谢谢,这就像一个众所周知的魅力。您能否详细说明为什么通过“c”运算符转换为列表不同于使用as.list(),以及为什么使用do.call()来调用粘贴而不是仅使用粘贴()?显然,这些选项不起作用,但凭直觉,他们似乎应该感谢你塞巴斯蒂安-c!我对“apply”非常着迷,因为我使用的是sep=“”而不是collapse=“”。可能更好的方法是识别函数来自的实际包(tidyr?)。tidyverse packageTidyverse是一组包。尝试一下
?tidyverse::unite
——那里什么都没有。对于那些只想使用它来解决手头的问题而不想加载整个包的人来说,最好知道他们可以只加载tidyr。顺便说一句,我不是在批评答案
 new.df<-df%>%
 unite(together, letters, numbers, sep="")
df <- data.frame(letters = LETTERS[1:5], numbers = 1:5, stringsAsFactors=TRUE)
paste(df[1,], collapse="") # "11"
apply(df, 1, paste, collapse="") # "A1" "B2" "C3" "D4" "E5"
df[1,]
#    letters numbers
# 1       A       1
unlist(df[1,])
# letters numbers 
#  1       1