的数据帧的串联排(Concatenate rows of a data frame)

2019-07-05 18:48发布

我想利用与字符和数字的数据帧,并连接所有的每一行的元素为单个串,这将被存储为一个矢量的单个元素。 作为一个例子,让我的字母和数字的数据帧,然后我想通过粘贴功能以连接第一行,并希望返回值“A1”

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5)
df

##   letters numbers
## 1       A       1
## 2       B       2
## 3       C       3
## 4       D       4
## 5       E       5

paste(df[1,], sep =".")
## [1] "1" "1"

所以浆料的行中的每个元素转换成对应于“对应的电平的索引”就好像它是一个因素的整数,它保持它长度为2的向量。 (我知道/认为,这被强制为字符因素以这种方式表现,但作为R的不存储DF [1,]如)在所有(由is.factor(测试的因子,我无法验证它实际上是一个指数的水平)

is.factor(df[1,])
## [1] FALSE
is.vector(df[1,])
## [1] FALSE

所以,如果它不是一个向量的话很有道理,这是奇怪的表现,但我不能强迫它变成一个载体

> is.vector(as.vector(df[1,]))
[1] FALSE

使用as.character似乎没有在我试图帮助

任何人都可以解释这种现象?

Answer 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"

您可以更改df$letters用字符df$letters <- as.character(df$letters)如果你不想使用stringsAsFactors说法。

但是让我们假设这不是你想要的。 让我们假设你拥有几百列,你想他们都粘在一起。 我们可以做,以你的小例子,太:

df_args <- c(df, sep="")
do.call(paste, df_args)

## [1] "A1" "B2" "C3" "D4" "E5"

编辑:另一种方法和解释:

我意识到,你所遇到的问题是事实,你正在使用的一个因素,您使用的组合sep参数,而不是collapse (如@adibender回升)。 不同的是, sep给出了两个分开的载体之间的隔板collapse给出了一个载体内的分隔符。 当使用df[1,] ,你提供的单个载体来paste ,并因此必须使用collapse参数。 使用您获得的每一行和连接他们的想法,代码会做完全以下行,你想要什么:

apply(df, 1, paste, collapse="")

好了,现在的解释:

为什么不会as.list工作?

as.list将对象转换为一个列表。 所以,它的工作。 它会将您的数据帧转换到一个列表,然后忽略sep=""的说法。 c结合对象组合在一起。 从技术上讲,一个数据帧仅仅是一个列表,其中每列是一个元素,所有元素都具有相同的长度。 所以,当我与它相结合sep="" ,它只是成为一个常规列表与数据帧作为元素的列。

为什么要使用do.call

do.call允许您使用命名列表作为参数调用函数。 你不能只是把名单直入paste ,因为它不喜欢dataframes。 它是专为拼接载体。 所以请记住, dfargs是包含字母矢量,数字和SEP这是唯一包含“长度1矢量的矢量”列表。 当我使用do.call ,所产生的粘贴功能基本上paste(letters, numbers, sep)
但是,如果我原来的数据帧有哪些列"letters", "numbers", "squigs", "blargs"之后,我加入了分离再像以前那样? 然后通过粘贴功能do.call将如下所示:

paste(letters, numbers, squigs, blargs, sep)

所以你看它适用于任何数量的列。



Answer 2:

这确实是有点怪异,不过这也是什么是应该发生的。 当您创建data.frame像你一样,列letters被存储为factor 。 自然因素没有顺序,因此当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]因此A被转换为值1 ,当as.numeric施加。 这是当你调用会发生什么paste(df[1, ]) 因为列1和2是不同类的,粘贴第一变换行1至数字两个元件然后为字符。

当你想连接两列,你首先需要在第一行转换成字符:

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

作为@塞巴斯蒂安-C所指出的,你也可以使用stringsAsFactors = FALSE在创建data.frame的,那么你可以省略as.character()的一步。



Answer 3:

对于使用库(tidyverse)的,你可以简单地使用统一的功能。

 new.df<-df%>%
 unite(together, letters, numbers, sep="")

这会给你一个名为“合”与A1,B2等新列



Answer 4:

如果你想开始

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5, stringsAsFactors=TRUE)

..再有就是如何不一般规则df$letters会被任何给定函数来解释。 这对建模功能,字符和一些整数。其他一些因素。 即使是相同的功能,如膏可以有不同的解释是,这取决于你如何使用它:

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 

我不知道如何apply取得它做什么(即因子通过字符值表示) -如果你有兴趣,看它的源代码。 这可能是需要了解的,虽然,你可以信任(在这个特殊的含义) apply (在此特定场合)。 更一般地,它是每一块数据存储在一个可感知的格式是有用的,其包括存储的字符串作为字符串,即,使用stringsAsFactors=FALSE

顺便说一句,每介绍[R本书应该有这样的想法在字幕。 例如,我的用于退休计划是写“A(未左右)温和简介与R,所述stringsAsFactors = FALSE方式数据渔业禅”。



文章来源: Concatenate rows of a data frame