我正在尝试使用rbind合并许多数据帧。如果我调用rbind directy,就没有问题:
> test <- rbind(x)
> is.data.frame(x)
[1] TRUE但是,如果我使用do.call,我会遇到一个问题,我的字符列被折叠,数据帧被转换为矩阵。
>test <- do.call("rbind", x)
> is.data.frame(test)
[1] FALSE根据?rbind文档,我尝试了add stringsAsFactors = FALSE,但行为没有变化。我的数据表如下所示:
ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12
… … ...rbind输出如下所示,但do.call("rbind", x)输出如下所示,其中sequence列不再是字符:
ID 363 426 91
Sequence 98 353 100
descriptor g12 b12 c12 我想使用do.call,因为我循环遍历了一组数据帧,以便使用下面的脚本合并它们。另一个有用的答案可能会提供另一种解决方案,说明如何在循环中调用多个数据帧时合并它们。
stringsAsFactors = FALSE
dfs <- as.list(ls(pattern="Data_"))
for (i in 1:length(dfs)) {
x <- get(as.character(dfs[i]))
AllData <- do.call("rbind", x)
}dfs是我的工作环境中的数据帧列表,我使用get获取实际的数据帧
谢谢。
发布于 2011-11-02 06:22:52
有两个不同的问题会给你带来困难。
stringsAsFactors您看stringsAsFactors是正确的,但没有在正确的位置调用它。
您有两个选择。您可以在您的options中设置它,如下所示:
options(stringsAsFactors=FALSE)或者在用于创建data.table的代码中:
a <- read.table(textConnection("ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12"),
header=T, stringsAsFactors=FALSE)do.call()的
args=参数在想要使用do.call()来实现这一点上,您也走对了道路。但是,正如@Sacha指出的那样,dfs需要是一个data.frame列表,而不是一个单独的data.frame (它本身就是一个向量列表)。
# Create list of two data.frames
b <- a
dfs <- list(a, b)
# Or, if you start with a list of their names
dfs <- list("a", "b")
dfs <- lapply(dfs, get)
# Check that this works
do.call("rbind", dfs)
# ID sequence descriptor
# 1 1 aaacccttt g12
# 2 2 actttgtgt e34
# 3 3 tttgggctc b12
# 4 4 ccgcgcgcg c12
# 5 1 aaacccttt g12
# 6 2 actttgtgt e34
# 7 3 tttgggctc b12
# 8 4 ccgcgcgcg c12这也适用于您,即使您只有一个长度,只要它包装在( data.frame -1) list中,就像这样:dfs <- list(a)
发布于 2011-11-02 06:32:44
使用Josh的示例代码。我非常确定正在发生的事情是这样的:
Data:
x <- read.table(textConnection("ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12"),
header=T, stringsAsFactors=FALSE)首先是这个:
rbind(x)不执行任何操作,因为只有一个参数。也就是说,没有任何东西可以附加到数据帧上,因此它只返回相同的数据帧。然后:
do.call("rbind", x)这里发生的事情是使用列表x中的所有参数调用rbind()。数据框是以列为元素的列表。因此,这将与以下内容相同:
rbind(x$ID,x$sequence,x$descriptor)所以你把三个向量逐行放在一起。因此,这变成了你所拥有的东西的转置,因为data.frames只按列存储不同类型的向量,这必须成为字符矩阵。
我认为,如果x是一个数据帧列表,那么它工作得很好。只是它本身不应该是一个数据帧。
发布于 2011-11-02 06:33:36
我认为你寻找的东西可以使用Reduce在没有循环的情况下完成。它是一个高阶函数,它将一个函数连续应用于列表中的两个元素。
dfs <- as.list(ls(pattern="Data_"))
Reduce('rbind', dfs)https://stackoverflow.com/questions/7973535
复制相似问题