我有一些代码,在一个地方最终得到一个数据帧列表,我真的想转换为一个大数据帧.
我从之前的一个问题中得到了一些指示,这个问题试图做类似但更复杂的事情.
这是我开始的一个例子(为了说明,这是非常简化的):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用这个:
df <- do.call("rbind", listOfDataFrames)
Run Code Online (Sandbox Code Playgroud) LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
如何制作数据框列表以及如何从列表中访问每个数据框?
例如,如何将这些数据框放在列表中?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
Run Code Online (Sandbox Code Playgroud) 可能重复:同时
合并列表中的多个数据帧
例如data.frames:
df1 = data.frame(id=c('1','73','2','10','43'),v1=c(1,2,3,4,5)) <br>
df2 = data.frame(id=c('7','23','57','2','62','96'),v2=c(1,2,3,4,5,6)) <br>
df3 = data.frame(id=c('23','62'),v3=c(1,2)) <br>
Run Code Online (Sandbox Code Playgroud)
注意:id每个data.frame都是唯一的.我希望得到的矩阵看起来像
1 1 NA NA
2 3 4 NA
7 NA 1 NA
10 4 NA NA
23 NA 2 1
43 5 NA NA
57 NA 3 NA
62 NA 5 2
73 2 NA NA
96 NA 6 NA
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我只显示3个数据集,我实际上至少有22个数据集,所以最后我想要一个nx(22 + 1)矩阵,其中n是所有22个数据集的id数.
给定2个数据集,我需要ids在第一列中获取它们,第二列和第三列用值填充,如果没有值,则输入NA.
如何使用R连接多个数据帧dplyr?
new <- left_join(x,y, by = "Flag")
Run Code Online (Sandbox Code Playgroud)
这是我用来离开连接x和y的代码,代码不适用于多个连接
new <- left_join(x,y,z by = "Flag")
Run Code Online (Sandbox Code Playgroud) 我知道一个可以合并(加入)两大data.table争夺的merge功能或[.data.table功能.但是,如果我说10,data.tables并且想要do.call将它们全部合并在一起,是否有一个功能可以做到这一点?目前我do.call(cbind, ...)只使用非常特殊的情况.
我从4 df收集数据,并希望通过rownames合并它们.我正在寻找一种有效的方法来做到这一点.这是我拥有的数据的简化版本.
df1 <- data.frame(N= sample(seq(9, 27, 0.5), 40, replace= T),
P= sample(seq(0.3, 4, 0.1), 40, replace= T),
C= sample(seq(400, 500, 1), 40, replace= T))
df2 <- data.frame(origin= sample(c("A", "B", "C", "D", "E"), 40,
replace= T),
foo1= sample(c(T, F), 40, replace= T),
X= sample(seq(145600, 148300, 100), 40, replace= T),
Y= sample(seq(349800, 398600, 100), 40, replace= T))
df3 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
df4 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
rownames(df1) <- paste("P", sprintf("%02d", c(1:40)), sep= "")
rownames(df2) …Run Code Online (Sandbox Code Playgroud) 我有一个包含数据框的列表作为其在R中的元素.
例:
df1 <- data.frame("names"=c("John","Sam","Dave"),"age"=c(21,22,25))
df2 <- data.frame("names"=c("John","Sam"),"score"=c(22,25))
df3 <- data.frame("names"=c("John","Sam","Dave"),"country"=c("US","SA","NZ"))
mylist <- list(df1,df2,df3)
Run Code Online (Sandbox Code Playgroud)
是否可以在不使用循环的情况下将mylist的所有元素合并在一起?
我希望这个例子的输出是:
names age score country
1 John 21 22 US
2 Sam 22 25 SA
Run Code Online (Sandbox Code Playgroud)
此示例中的列表只有三个元素; 但是,我正在寻找一种可以处理任意数量元素的解决方案.
suffixes在merge仅公共列名的作品.无论如何还要将其扩展到其余列,而无需在合并之前手动更新列?
那是 -
df1 <- data.table(
a = c(1,2,3,4,5,6),
b = c('a','b','f','e','r','h'),
d = c('q','l','o','n','q','z')
)
df2 <- data.table(
a = c(1,2,3,4,5,6),
d = c('q','l','o','n','q','z')
)
colnames(merge(df1,df2, by = 'a', suffixes = c("1","2")))
#[1] "a" "b" "d1" "d2" what it does
#[1] "a" "b1" "d1" "d2" what I'd like it to do
Run Code Online (Sandbox Code Playgroud)
我正在处理的这种方式类似于@ mrip的答案.
df1 <- data.table(
a = c(1,2,3,4,5,6),
b = c('a','b','f','e','r','h'),
r = c('a','b','f','e','r','h'),
d = c('q','l','o','n','q','z')
)
df2 <- data.table(
a = c(1,2,3,4,5,6),
c …Run Code Online (Sandbox Code Playgroud) 我将与您分享我的庞大数据集的简化版本.这个简化版本完全尊重我原始数据集的结构,但包含的列表元素,数据框,变量和观察结果比原始数据集少.
根据对这个问题的最热烈回答:如何制作一个很好的R可重复的例子?,我使用输出共享我的数据集,通过dput(query1)在R控制台中复制/粘贴以下代码块,为您提供可立即在R中使用的内容:
structure(list(plu = structure(list(year = structure(list(id = 1:3,
station = 100:102, pluMean = c(0.509068994778059, 1.92866478959912,
1.09517453602154), pluMax = c(0.0146962179957886, 0.802984389130343,
2.48170762478472)), .Names = c("id", "station", "pluMean",
"pluMax"), row.names = c(NA, -3L), class = "data.frame"), month = structure(list(
id = 1:3, station = 100:102, pluMean = c(0.66493845927034,
-1.3559338786041, 0.195600637750077), pluMax = c(0.503424623872161,
0.234402501255681, -0.440264545434053)), .Names = c("id",
"station", "pluMean", "pluMax"), row.names = c(NA, -3L), class = "data.frame"),
week = structure(list(id = 1:3, station = 100:102, …Run Code Online (Sandbox Code Playgroud)