首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用do.call时丢失数据帧

使用do.call时丢失数据帧
EN

Stack Overflow用户
提问于 2011-11-02 06:09:11
回答 3查看 655关注 0票数 5

我正在尝试使用rbind合并许多数据帧。如果我调用rbind directy,就没有问题:

代码语言:javascript
复制
> test <- rbind(x)
> is.data.frame(x)
[1] TRUE

但是,如果我使用do.call,我会遇到一个问题,我的字符列被折叠,数据帧被转换为矩阵。

代码语言:javascript
复制
>test <- do.call("rbind", x)
> is.data.frame(test)
[1] FALSE

根据?rbind文档,我尝试了add stringsAsFactors = FALSE,但行为没有变化。我的数据表如下所示:

代码语言:javascript
复制
ID  sequence    descriptor
1   aaacccttt   g12
2   actttgtgt   e34
3   tttgggctc   b12
4   ccgcgcgcg   c12
…   …       ...

rbind输出如下所示,但do.call("rbind", x)输出如下所示,其中sequence列不再是字符:

代码语言:javascript
复制
ID  363 426 91
Sequence 98 353 100
descriptor  g12 b12 c12 

我想使用do.call,因为我循环遍历了一组数据帧,以便使用下面的脚本合并它们。另一个有用的答案可能会提供另一种解决方案,说明如何在循环中调用多个数据帧时合并它们。

代码语言:javascript
复制
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获取实际的数据帧

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-02 06:22:52

有两个不同的问题会给你带来困难。

  • stringsAsFactors

您看stringsAsFactors是正确的,但没有在正确的位置调用它。

您有两个选择。您可以在您的options中设置它,如下所示:

代码语言:javascript
复制
options(stringsAsFactors=FALSE)

或者在用于创建data.table的代码中:

代码语言:javascript
复制
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 (它本身就是一个向量列表)。

代码语言:javascript
复制
# 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)

票数 4
EN

Stack Overflow用户

发布于 2011-11-02 06:32:44

使用Josh的示例代码。我非常确定正在发生的事情是这样的:

代码语言:javascript
复制
Data:
    x <- read.table(textConnection("ID  sequence    descriptor
    1   aaacccttt   g12
    2   actttgtgt   e34
    3   tttgggctc   b12
    4   ccgcgcgcg   c12"),
    header=T, stringsAsFactors=FALSE)

首先是这个:

代码语言:javascript
复制
rbind(x)

不执行任何操作,因为只有一个参数。也就是说,没有任何东西可以附加到数据帧上,因此它只返回相同的数据帧。然后:

代码语言:javascript
复制
do.call("rbind", x)

这里发生的事情是使用列表x中的所有参数调用rbind()。数据框是以列为元素的列表。因此,这将与以下内容相同:

代码语言:javascript
复制
rbind(x$ID,x$sequence,x$descriptor)

所以你把三个向量逐行放在一起。因此,这变成了你所拥有的东西的转置,因为data.frames只按列存储不同类型的向量,这必须成为字符矩阵。

我认为,如果x是一个数据帧列表,那么它工作得很好。只是它本身不应该是一个数据帧。

票数 2
EN

Stack Overflow用户

发布于 2011-11-02 06:33:36

我认为你寻找的东西可以使用Reduce在没有循环的情况下完成。它是一个高阶函数,它将一个函数连续应用于列表中的两个元素。

代码语言:javascript
复制
dfs <- as.list(ls(pattern="Data_"))
Reduce('rbind', dfs)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7973535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档