R 使用do.call时丢失数据帧
我正在尝试使用rbind合并多个数据帧。如果我直接给rbind打电话,没有问题:R 使用do.call时丢失数据帧,r,dataframe,R,Dataframe,我正在尝试使用rbind合并多个数据帧。如果我直接给rbind打电话,没有问题: > test <- rbind(x) > is.data.frame(x) [1] TRUE 根据?rbind文档,我尝试了添加stringsAsFactors=FALSE,但行为没有改变。我的数据表如下所示: ID sequence descriptor 1 aaacccttt g12 2 actttgtgt e34 3 tttgggctc b12 4 cc
> test <- rbind(x)
> is.data.frame(x)
[1] TRUE
根据?rbind文档,我尝试了添加stringsAsFactors=FALSE
,但行为没有改变。我的数据表如下所示:
ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12
… … ...
options(stringsAsFactors=FALSE)
rbind输出如下所示,但是do.call(“rbind”,x)
输出如下所示,其中序列列不再是字符:
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)
}
stringsAsFactors=FALSE
dfs有两个不同的问题会给您带来困难
stringsAsFactors
您查看stringsAsFactors
是对的,但只是没有在正确的位置调用它
你有两个选择。您可以在选项中设置它,如下所示:
ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12
… … ...
options(stringsAsFactors=FALSE)
或者在用于创建数据的代码中。表
s:
a <- read.table(textConnection("ID sequence descriptor
1 aaacccttt g12
2 actttgtgt e34
3 tttgggctc b12
4 ccgcgcgcg c12"),
header=T, stringsAsFactors=FALSE)
即使只有一个数据.frame
,只要它被包装在一个(长度为1)的列表中,就像这样:dfs使用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)
因为只有一个论点,所以什么也不做。也就是说,没有任何附加到数据帧的内容,因此它只返回相同的数据帧。然后:
do.call("rbind", x)
这里发生的事情是使用列表x
中的所有参数调用rbind()
。数据框是以列为元素的列表。因此,这与:
rbind(x$ID,x$sequence,x$descriptor)
所以你把三个向量按行放在一起。因此,这将成为您所拥有的内容的转置,并且由于data.frames只按列存储不同类型的向量,因此必须成为字符矩阵
我认为如果x
是一个数据帧列表,它就可以正常工作。它本身不应该是一个数据帧。我认为,使用Reduce
无需循环就可以实现您的搜索。它是一个高阶函数,它将一个函数连续应用于列表中的两个元素
dfs <- as.list(ls(pattern="Data_"))
Reduce('rbind', dfs)
dfs谢谢Sacha,我想你已经很好地描述了所发生的一切谢谢Ramnath,但是当我尝试这种方法时,我不会返回数据集,而是返回字符矩阵。我不知道Reduce,所以我一定会调查的。
dfs <- as.list(ls(pattern="Data_"))
Reduce('rbind', dfs)