Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用do.call时丢失数据帧_R_Dataframe - Fatal编程技术网

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

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

我正在尝试使用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   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)