R 合并,cbind:如何更好地合并?
我想将多个向量合并到一个数据帧中。有两个变量,R 合并,cbind:如何更好地合并?,r,merge,cbind,R,Merge,Cbind,我想将多个向量合并到一个数据帧中。有两个变量,city和id将用于将向量匹配到数据帧 df <- data.frame(array(NA, dim =c(10*50, 2))) names(df)<-c("city", "id") df[,1]<-rep(1:50, each=10) df[,2]<-rep(1:10, 50) 我有50个城市的数据,我想把它们合并到df中的一列。我尝试了以下代码: for(i in 1:50){ citydata<-cbind(c
city
和id
将用于将向量匹配到数据帧
df <- data.frame(array(NA, dim =c(10*50, 2)))
names(df)<-c("city", "id")
df[,1]<-rep(1:50, each=10)
df[,2]<-rep(1:10, 50)
我有50个城市的数据,我想把它们合并到df中的一列。我尝试了以下代码:
for(i in 1:50){
citydata<-cbind(city=i,id=sample(1:10,6),obs=rnorm(6)) # each city data
df<-merge(df,citydata, by=c("city", "id"), all=TRUE)} # merge to df
它将创建50列,而不是一个长列
如何将cbind(city=I,id=sample(1:10,6),obs=rnorm(6))
合并到df
的一个漂亮的长列中?似乎cbind
和merge
都不是好办法。
如果有50个
citydata
(每个有6行),我可以rbind
将它们作为一个长数据并使用数据。table
方法或expand.gird
+合并方法为Philip和Jaap建议
我想知道我是否可以通过一个循环一个接一个地合并每个citydata,而不是rbind
它们并将其合并到df
数据中。表
对此很有用:
library(data.table)
df <- data.table(df)
> df
city id
1: 1 1
2: 1 2
3: 1 3
4: 1 4
5: 1 5
---
496: 50 6
497: 50 7
498: 50 8
499: 50 9
500: 50 10
由于这两个表具有相同的键列,下面将通过citydata
中的键列查找df
行,然后通过在citydata
中查找值来定义df
中的obs
。因此,生成的对象是原始的df
,但在citydata
中定义的地方定义了obs
:
df[citydata,obs:=i.obs]
> df
city id obs
1: 1 1 0.19168335
2: 1 2 0.35753229
3: 1 3 1.35707865
4: 1 4 1.91871907
5: 1 5 -0.56961647
---
496: 50 6 0.09565473
497: 50 7 NA
498: 50 8 NA
499: 50 9 NA
500: 50 10 NA
数据。表
适用于此:
library(data.table)
df <- data.table(df)
> df
city id
1: 1 1
2: 1 2
3: 1 3
4: 1 4
5: 1 5
---
496: 50 6
497: 50 7
498: 50 8
499: 50 9
500: 50 10
由于这两个表具有相同的键列,下面将通过citydata
中的键列查找df
行,然后通过在citydata
中查找值来定义df
中的obs
。因此,生成的对象是原始的df
,但在citydata
中定义的地方定义了obs
:
df[citydata,obs:=i.obs]
> df
city id obs
1: 1 1 0.19168335
2: 1 2 0.35753229
3: 1 3 1.35707865
4: 1 4 1.91871907
5: 1 5 -0.56961647
---
496: 50 6 0.09565473
497: 50 7 NA
498: 50 8 NA
499: 50 9 NA
500: 50 10 NA
在base R中,您可以结合使用expand.grid
和merge
:
citydata <- expand.grid(city=1:50,id=1:6)
citydata$obs <- rnorm(nrow(citydata))
res <- merge(df, citydata, by = c("city","id"), all.x = TRUE)
dplyr和tidyr的类似方法:
在base R中,您可以结合使用expand.grid
和merge
:
citydata <- expand.grid(city=1:50,id=1:6)
citydata$obs <- rnorm(nrow(citydata))
res <- merge(df, citydata, by = c("city","id"), all.x = TRUE)
dplyr和tidyr的类似方法:
或者一气呵成:setDT(df)[CJ(city=1:50,id=1:6)[,obs:=rnorm(.N)],obs:=i.obs,on=c(“city”,“id”)][
Nice one。(不过我也猜OP有预先存在的真实城市数据,所以创建连接表更多的是为了展示合并的效果,而不是作为实际解决方案工作流的一部分。)Thanx。考虑到这个问题,我认为很有可能citydata
是已经存在的数据,df
必须使用CJ
来构造,以获得所需的结果。或者一次完成所有的事情:setDT(df)[CJ(city=1:50,id=1:6)[,obs:=rnorm N],obs:=I.obs,on=c(“city”,“id”)[/code>。(不过我也猜OP有预先存在的真实城市数据,所以创建连接表更多的是为了展示合并的效果,而不是作为实际解决方案工作流的一部分。)Thanx。看看这个问题,我认为很有可能citydata
是已经存在的数据,df
必须使用CJ
构建,以获得所需的结果。
> head(res,12)
city id obs
1: 1 1 -0.3121133
2: 1 2 -1.3554576
3: 1 3 -0.9056468
4: 1 4 -0.6511869
5: 1 5 -1.0447499
6: 1 6 1.5939187
7: 1 7 NA
8: 1 8 NA
9: 1 9 NA
10: 1 10 NA
11: 2 1 0.5423479
12: 2 2 -2.3663335
library(dplyr)
library(tidyr)
res <- crossing(city=1:50,id=1:6) %>%
mutate(obs = rnorm(n())) %>%
right_join(., df, by = c("city","id"))
> res
Source: local data frame [500 x 3]
city id obs
(int) (int) (dbl)
1 1 1 -0.5335660
2 1 2 1.0582001
3 1 3 -1.3888310
4 1 4 1.8519262
5 1 5 -0.9971686
6 1 6 1.3508046
7 1 7 NA
8 1 8 NA
9 1 9 NA
10 1 10 NA
.. ... ... ...