使用do.call时丢失数据帧

zac*_*ach 5 r dataframe

我正在尝试使用rbind合并许多数据帧.如果我直接调用rbind,则没有问题:

> test <- rbind(x)
> is.data.frame(x)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

>test <- do.call("rbind", x)
> is.data.frame(test)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

根据我试过的?rbind文档add stringsAsFactors = FALSE但没有改变行为.我的数据表看起来像这样:

ID  sequence    descriptor
1   aaacccttt   g12
2   actttgtgt   e34
3   tttgggctc   b12
4   ccgcgcgcg   c12
…   …       ...
Run Code Online (Sandbox Code Playgroud)

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

ID  363 426 91
Sequence 98 353 100
descriptor  g12 b12 c12 
Run Code Online (Sandbox Code Playgroud)

我想使用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) 
  }
Run Code Online (Sandbox Code Playgroud)

dfs 是我工作环境中的数据框列表,我使用了实际的数据框 get

谢谢.

Jos*_*ien 5

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

  • stringsAsFactors

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

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

options(stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

或者在用于创建 s 的代码中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)
Run Code Online (Sandbox Code Playgroud)
  • args=论证do.call()

do.call()您想要用于此目的也是正确的。但是,正如 @Sacha 指出的,dfs需要是一个 s 列表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
Run Code Online (Sandbox Code Playgroud)

即使您只有一个data.frame,只要将它包裹在 (length-1) 中list,这也应该对您有用,如下所示:dfs <- list(a)