我想合并多个向量到数据框。有两个变量,city
和id
将用于匹配矢量到数据帧。合并,cbind:如何合并更好?
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个向量,每个向量对应50个城市。问题是每个城市只有6个obs。每个城市将有4个新手。
给你举个例子,城市1的数据是这样的:
seed(1234)
cbind(city=1,id=sample(1:10,6),obs=rnorm(6))
我有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
但是,如果我运行此,循环会显示这样的警告:
In merge.data.frame(df, citydata, by = c("city", "id"), ... :
column names ‘obs.x’, ‘obs.y’ are duplicated in the result
,它会创建50列,而不是一个长列。
如何合并cbind(city=i,id=sample(1:10,6),obs=rnorm(6))
到df
在一个很好的长列中?看起来cbind
和merge
都不行。
在情况下,有50 citydata
(每个都有6行),我可以rbind
它们作为一个长数据,并使用data.table
方法或expand.gird
+ merge
方式作为菲利普和夏侯建议。
我想知道我是否可以通过一个循环合并每个城市数据,而不是rbind
他们并合并到df
。
或evrything一气呵成:'setDT(DF)[CJ(城市= 1:50, id = 1:6)[,obs:= rnorm(.N)],obs:= i.obs,on = c(“city”,“id”)] []' – Jaap
不错。 (但是我也猜测OP有预先存在的真实城市数据,所以创建连接表更多的是展示合并的工作原理,而不是实际解决方案工作流的一部分。) – Philip
Thanx。看看这个问题,我认为这很可能是'citydata'是已经存在的数据,'df'必须用'CJ'来构建才能得到想要的结果。 – Jaap