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
+
合并
方法为PhilipJaap建议


我想知道我是否可以通过一个循环一个接一个地合并每个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
..   ...   ...        ...