注意: 我在第一次发布时更改了示例。我的第一个例子太简单了,无法捕捉真正的问题。
我有两个数据框,在一列中排序不同。我想匹配一列,然后合并第二列的值。第二列需要保持相同的顺序。
所以我有这个:
state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)
s1
s2
返回:
> s1
state value1
1 IA 1
2 IA 2
3 IA 3
4 IL 4
5 IL 5
6 IL 6
> s2
state value2
1 IL 3
2 IL 4
3 IL 5
4 IA 6
5 IA 7
6 IA 8
我想要这个:
state value1 value2
1 IA 1 6
2 IA 2 7
3 IA 3 8
4 IL 4 3
5 IL 5 4
6 IL 6 5
我要愚蠢地试图解决这个问题。似乎它应该是一个简单的下标问题。
答案 0 :(得分:3)
有几种方法可以做到这一点(毕竟它是R)但我认为最清楚的是创建一个索引。我们需要一个创建顺序索引的函数(从1开始,以观察数结束)。
seq_len(3)
> [1] 1 2 3
但是我们需要在每个分组变量(状态)中计算这个索引。为此,我们可以使用R的ave
函数。它将数字作为第一个参数,然后是分组因子,最后是要在每个组中应用的函数。
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(注意使用with
,它告诉R在环境/数据帧中搜索变量。这比使用s1 $ value1,s2 $ value2等更好。)
现在我们可以简单地合并(加入)两个数据帧(通过两个数据帧中存在的变量:state和index)。
merge(s1,s2)
给出了
state index value1 value2
1 IA 1 1 6
2 IA 2 2 7
3 IA 3 3 8
4 IL 1 4 3
5 IL 2 5 4
6 IL 3 6 5
为此,每个数据框中的状态观察数应相同。
[编辑:为了清晰起见,对代码进行了评论。] [编辑:使用seq_len而不是按照hadley的建议创建新功能。]
答案 1 :(得分:0)
注意:检查上面答案的第5条评论。解决方案应该是
s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))
经过测试和工作。