我有一个我要合并的许多data.frames的列表.这里的问题是每个data.frame在行数和列数方面都不同,但它们都共享关键变量(我已经调用过"var1","var2"在下面的代码中).如果data.frames在列方面是相同的,我只能rbind,plyr的rbind.fill可以完成这项工作,但这些数据并非如此.
因为该merge命令仅适用于2个data.frames,所以我转向Internet寻求创意.我从这里得到了这个,它在R 2.7.2中完美运行,这是我当时所拥有的:
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
Run Code Online (Sandbox Code Playgroud)
我会像这样调用函数:
df <- merge.rec(my.list, by.x = c("var1", "var2"),
by.y = c("var1", "var2"), all = T, suffixes=c("", ""))
Run Code Online (Sandbox Code Playgroud)
但是在2.7.2之后的任何R版本中,包括2.11和2.12,此代码失败并出现以下错误:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
(很明显,我在其他地方看到了其他对此错误的引用而没有解决方案).
有什么方法可以解决这个问题吗?
如果这个问题已经得到解答,我很抱歉.另外,这是我第一次使用stackoverflow.
我有一个关于列表,数据框merge()和/或的初学者R问题rbind().
我开始使用看起来像这样的Panel
COUNTRY YEAR VAR
A 1
A 2
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
为了提高效率,我创建了一个列表,其中包含每个国家/地区的一个数据框,并对每个国家/地区执行了各种计算data.frame.但是,我似乎无法将各个数据帧再次组合成一个大帧.
rbind()并merge()告诉我只允许更换元素.
有人能告诉我我做错了什么以及如何重新组合数据帧?
谢谢
我有一个数据帧:
foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)),
df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))
Run Code Online (Sandbox Code Playgroud)
我可以将其转换为表单的单个数据框:
data.frame(x = c('a', 'b', 'c', 'd', 'e', 'f'), y= c(1,2,3,4,5,6))
Run Code Online (Sandbox Code Playgroud)
?
我想把merge几个data.frames合二为一data.frame.因为我有一个完整的文件列表,我试图用循环结构来做.
到目前为止,循环方法工作正常.然而,它看起来效率很低,我想知道是否有更快更容易的方法.
这是场景:我有一个包含多个.csv文件的目录.每个文件包含可用作合并变量的相同标识符.由于文件的大小相当大,我想把每个文件一次一个地读入R而不是一次读取所有文件.所以我得到了目录的所有文件,list.files并在前两个文件中读取.之后我用它merge来买一个data.frame.
FileNames <- list.files(path=".../tempDataFolder/")
FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""),
header=T, na.strings="NULL")
SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
Run Code Online (Sandbox Code Playgroud)
现在我使用for循环将所有剩余的.csv文件和merge它们放入已存在的文件中data.frame:
for(i in 3:length(FileNames)){
ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""),
header=T, na.strings="NULL")
dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
all=T)
}
Run Code Online (Sandbox Code Playgroud)
即使它工作得很好我想知道是否有更优雅的方式来完成工作?
我知道在这里有很多关于使用do.call或ldply将data.frames列表转换为单个data.frame的方法,但这个问题是关于理解两种方法的内部工作方式并试图找出原因我无法将两个相同结构,相同字段名称等近100万个df的列表连接到一个data.frame中.每个data.frame都是一行和21列.
数据以JSON文件开头,我使用fromJSON转换为列表,然后运行另一个lapply来提取列表的一部分并转换为data.frame,最后得到一个data.frames列表.
我试过了:
df <- do.call("rbind", list)
df <- ldply(list)
Run Code Online (Sandbox Code Playgroud)
但我不得不在让它运行3个小时并且没有得到任何回报之后终止这个过程.
有更有效的方法吗?我怎样才能解决正在发生的事情以及为什么需要这么长时间?
仅供参考 - 我在使用RHEL的72GB四核服务器上使用RStudio服务器,所以我认为内存不是问题所在.sessionInfo如下:
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-redhat-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] multicore_0.1-7 plyr_1.7.1 rjson_0.2.6
loaded via a namespace (and not attached):
[1] tools_2.14.1
>
Run Code Online (Sandbox Code Playgroud) 我有一个列表,看起来像这样:x[[state]][[year]].这个元素的每个元素都是一个数据框,单独访问它们不是问题.
但是,我想在多个列表中绑定数据帧.更具体地说,我想拥有与我多年一样多的数据帧输出,即每年所有状态数据帧的rbind.换句话说,我想将我所有的状态数据逐年合并到不同的数据框中.
我知道我可以将单个列表组合到一个数据框中do.call("rbind",list).但是我不知道如何在列表列表中这样做.
我知道将数据帧列表合并为一个的基础知识,如前所述.但是,我对保持行名称的聪明方法感兴趣.假设我有一个相当相等的数据帧列表,并将它们保存在命名列表中.
library(plyr)
library(dplyr)
library(data.table)
a = data.frame(x=1:3, row.names = letters[1:3])
b = data.frame(x=4:6, row.names = letters[4:6])
c = data.frame(x=7:9, row.names = letters[7:9])
l = list(A=a, B=b, C=c)
Run Code Online (Sandbox Code Playgroud)
当我使用时do.call,列表名称与行名称组合:
> rownames(do.call("rbind", l))
[1] "A.a" "A.b" "A.c" "B.d" "B.e" "B.f" "C.g" "C.h" "C.i"
Run Code Online (Sandbox Code Playgroud)
当我使用任何一个时rbind.fill,bind_rows或者rbindlist行名称被数字范围替换:
> rownames(rbind.fill(l))
> rownames(bind_rows(l))
> rownames(rbindlist(l))
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
Run Code Online (Sandbox Code Playgroud)
当我从列表中删除名称时,do.call产生所需的输出:
> names(l) = NULL
> rownames(do.call("rbind", l))
[1] "a" …Run Code Online (Sandbox Code Playgroud) 我有一个很大的列表(200.000)个条目。每个包含一个 16x3 tibble。将所有这些小标题组合成一个大小标题而不是大列表的最快方法是什么?
该列表如下所示:
x <- list( a = tibble(some_char = rep("pens", 16),
some_int = rep(1, 16),
some_other_int = rep(14, 16)),
b = tibble(some_char = rep("rubber", 16),
some_int = rep(5, 16),
some_other_int = rep(9, 16)))
)
Run Code Online (Sandbox Code Playgroud) 问题与这一问题非常相似.它用于将数据帧列表组合成单个较长的数据帧.但是,我希望通过添加包含列表索引(id或source)的额外列来保留数据来自列表项的信息.
这是数据(来自链接示例的借用代码):
dfList <- NULL
set.seed(1)
for (i in 1:3) {
dfList[[i]] <- data.frame(a=sample(letters, 5, rep=T), b=rnorm(5), c=rnorm(5))
}
Run Code Online (Sandbox Code Playgroud)
使用下面的代码提供了连接数据框,但不添加列表索引的列:
df <- do.call("rbind", dfList)
Run Code Online (Sandbox Code Playgroud)
如何在创建列以捕获列表中的原点时连接列表中的数据框?类似于以下内容:

非常感谢你提前.
我正在从 R 中的数据框列表中提取特定的行,并希望将这些行组装到一个新的数据框中。例如,我将使用虹膜数据:
data(iris)
a.iris <- split(iris, iris$Species)
b.iris <- lapply(a.iris, function(x) with(x, x[3,]))
Run Code Online (Sandbox Code Playgroud)
我希望将返回的结果lapply()安排到与原始数据帧(例如,names(iris))具有相同结构的单个数据帧中。我一直在查看 plyr 包,但找不到正确的代码来完成这项工作。任何帮助将不胜感激!
布赖恩