我正在尝试使用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
谢谢.
有两个不同的问题给您带来困难。
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)
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |