我想合并一大组数据框(大约 30 个),每个数据框有大约 200 个变量。这些数据集非常相似但不完全相同。
请在下面找到两个示例数据框:
library(data.table)
library(haven)
df1 <- fread(
"A B C iso year
0 B 1 NLD 2009
1 A 2 NLD 2009
0 Y 3 AUS 2011
1 Q 4 AUS 2011
0 NA 7 NLD 2008
1 0 1 NLD 2008
0 1 3 AUS 2012",
header = TRUE
)
df2 <- fread(
"A B D E iso year
0 1 1 NA ECU 2009
1 0 2 0 ECU 2009
0 0 3 0 …Run Code Online (Sandbox Code Playgroud) 为什么下面的代码不起作用?
library(data.table)
team_table <- as.data.table(matrix(NA,ncol = 11))
rbind(team_table,1:11)
Run Code Online (Sandbox Code Playgroud)
而同版本的data.frame呢?
team_table <-as.data.frame(matrix(NA,ncol = 11))
rbind(team_table,1:11)
Run Code Online (Sandbox Code Playgroud) 为什么 rbind 将我的数字元素列表转换为字符?
> class(mymatrix.list)
[1] "list"
> class(mymatrix.list[[1]])
[1] "numeric"
> mymatrix.results = do.call(rbind, mymatrix.list)
> class(mymatrix.results)
[1] "matrix"
> class(mymatrix.results[1])
[1] "character"
Run Code Online (Sandbox Code Playgroud) 我试图将几个文件连接成一个主文件.有5个文件具有相同的结构,我可以将每个文件单独读入数据框中,没有任何问题.我甚至手动设置200+变量的列类,而不是让R决定,因为我认为这导致了问题.但是,将任意两个文件附加在一起会导致内存不足.
警告消息:1:在rbind(deparse.level,...)中:达到4043Mb的总分配:请参阅help(memory.size)
所以我做了一些实验:我加入了两个不同的文件1块.这样可行.我加入了一大块文件2到一大块文件1.这很有效.我加入了一大块文件2到原始文件1.这是有效的.
这些文件中的每一个都在200MB以下,所以我不确定我是否应该耗尽内存.如果有人感兴趣,数据来自hearstchallenge.com.竞争已经结束,我们只是将数据用于分析实验(而不是编程!).
有关如何解决此问题的任何建议?
将三个(或更多)data.tables与rbind合并时发出错误,并且两个非空data.tables之间存在空data.table:
> require(data.table)
Loading required package: data.table
data.table 1.9.2 For help type: help("data.table")
> DT <- data.table(x=c(1,2,3))
> rbind(DT, data.table(), DT)
Error in setcolorder(tt, chmatch(match.names, make.names(original.names[[x]], (from <text>#1) :
Column numbers in neworder out of bounds: NA
Run Code Online (Sandbox Code Playgroud)
如果空data.table最终会发生这种情况:
> rbind(DT, DT, data.table())
x
1: 1
2: 2
3: 3
4: 1
5: 2
6: 3
Run Code Online (Sandbox Code Playgroud)
但是当空的data.table在开头时会发生一些其他错误:
> rbind(data.table(), DT, DT)
Error in data.table::.rbind.data.table(...) (from <text>#1) :
Some colnames of argument 2 (x) are not present in colnames of item 1. …Run Code Online (Sandbox Code Playgroud) 我想使用以下代码将列表转换为数据框:
ls<-list(a=c(1:4),b=c(3:6))
do.call("rbind",ls)
Run Code Online (Sandbox Code Playgroud)
添加do.call得到的结果如下图。它data.frame根据需要返回一个对象。
do.call("rbind",ls)
[,1] [,2] [,3] [,4]
a 1 2 3 4
b 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
但是,如果我直接使用rbind,它会返回一个列表。
为什么rbind在这两种情况下表现不同?
my.df<-rbind(ls)
str(ls)
my.df
a b
ls Integer,4 Integer,4
str(ls)
List of 2
$ a: int [1:4] 1 2 3 4
$ b: int [1:4] 3 4 5 6
Run Code Online (Sandbox Code Playgroud) 我的问题是如何扩展rbind()子类data.frame?我似乎无法正确扩展rbind()以使用即使是非常简单的子类。以下示例演示了该问题:
子类和方法定义:
new_df2 <- function(x, ...)
{
stopifnot(is.data.frame(x))
structure(x, class = c("df2", "data.frame"), author = "some user")
}
rbind.df2 <- function(..., deparse.level = 1)
{
NextMethod()
}
Run Code Online (Sandbox Code Playgroud)
我意识到rbind()在这种情况下扩展是不必要的,但我的宏伟计划是在我的子类上使用rbind.data.frame(),然后向其结果添加一些额外的检查/属性。
如果您调用以下命令,您会收到错误:Error in NextMethod() : generic function not specified。
不起作用:
t1 <- data.frame(a = 1:12, b = month.abb)
t2 <- new_df2(t1)
rbind(t2, t2)
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用NextMethod(generic = "rbind"),但在这种情况下,您会收到此错误:Error in NextMethod(generic = "rbind") : wrong value for .Method。
也不起作用:
rbind.df2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一种有效的(运行快速且编码简单)方法来执行该rbind.fill功能,但在基本 R 中。从我的搜索来看,似乎有很多库函数,例如smartbind、bind_rows和rbindon data.table,不过,如前所述,我需要一个基础 R 的解决方案。我发现使用:
df3 <- rbind(df1, df2[, names(df1)])
Run Code Online (Sandbox Code Playgroud)
从这个问题的答案来看,但它删除了列,而我希望NA添加额外的列。
如果此方法也适用于空的data.frame和已填充的方法,那就太好了,本质上只是设置返回已填充的方法。(这是为了简单起见,但如果不可能的话,如果变量为data.frame空,则将其替换为新变量并不困难。
我还希望它通过标记相同的列的列名称进行绑定。此外,第一个数据框可以比第二个数据框更大或更小,并且两者都可以具有另一个没有的列。
这是我想要的输入和输出示例(我只是编造了一些并不重要的数字)。
#inputs
a <- data.frame(aaa=c(1, 1, 2), bbb=c(2, 3, 3), ccc=c(1, 3, 4))
b <- data.frame(aaa=c(8, 5, 4), bbb=c(1, 1, 4), ddd=c(9, 9, 9), eee=(1, 2, 4))
#desired output
aaa bbb ccc ddd eee
1 2 1 NA NA
1 3 3 NA NA
2 3 4 NA NA
8 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法将数据帧列表(一行或空的大约 7000 个数据帧)重新绑定到单个数据帧中,但不删除列表中的空数据帧。
\n\n## Example of data\nl <- list(Name1 = data.frame(), \n Name2 = data.frame(V1 = "A", V2 = "B", stringsAsFactors = F), \n Name3 = data.frame(V1="B", V2= NA, V3 ="C", stringsAsFactors = F))\n\n> l\n$Name1\ndata frame with 0 columns and 0 rows\n\n$Name2\n V1 V2\n1 A B\n\n$Name3\n V1 V2 V3\n1 B NA C\n\nRun Code Online (Sandbox Code Playgroud)\n\n所以我尝试了一些 dplyr 解决方案,但它没有保留空数据框(并不奇怪,因为它没有行)
\n\n## rbind\nlibrary(dplyr)\n\ndf <- bind_rows(l,.id = "NAME")\n\n> df\n NAME V1 V2 V3\n1 Name2 A B <NA>\n2 Name3 B <NA> C\nRun Code Online (Sandbox Code Playgroud)\n\n有没有一种简单的方法可以得到这样的东西?
\n\n …我必须在 R 中的迭代过程中绑定/合并数据帧。有时,某些数据帧可能不存在,原因我不会在此处解释。我想知道如何绑定数据帧,即使调用一些不存在的数据帧也是如此。作为一个例子,我有这些数据框:
df.R_H <- data.frame(A=c(0,4,5,6,7),
B=c(3,9,4,5,8),
C=c(1,2,4,2,6))
df.B_C <- data.frame(A=c(0,4,5,6,7),
B=c(3,9,4,5,8),
C=c(1,2,4,2,6))
df.G_H <- data.frame(A=c(0,4,5,6,7),
B=c(3,9,4,5,8),
C=c(1,2,4,2,6))
Run Code Online (Sandbox Code Playgroud)
但是,在我的代码中我有这个:
df5 <- rbind(df.R_H,df.B_C,df.G_H,df.R_C)
df5
Run Code Online (Sandbox Code Playgroud)
df.R_C尽管数据框不存在,但如何绑定数据框?我无法单独检查哪些数据帧存在或不存在,因为我有数百种这样的情况,并且即使某些数据帧不存在,我也想自动执行此操作。