我想利用与字符和数字的数据帧,并连接所有的每一行的元素为单个串,这将被存储为一个矢量的单个元素。 作为一个例子,让我的字母和数字的数据帧,然后我想通过粘贴功能以连接第一行,并希望返回值“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
似乎没有在我试图帮助
任何人都可以解释这种现象?
当别人都集中在为什么你的代码是不工作,如何改进它,我要去尝试,更注重得到你想要的结果。 从你的描述,似乎你可以很容易地达到你想用什么贴:
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)
所以你看它适用于任何数量的列。
这确实是有点怪异,不过这也是什么是应该发生的。 当您创建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()
的一步。
对于使用库(tidyverse)的,你可以简单地使用统一的功能。
new.df<-df%>%
unite(together, letters, numbers, sep="")
这会给你一个名为“合”与A1,B2等新列
如果你想开始
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方式数据渔业禅”。