题
注意:强> 我改变从当我先贴的例子。第一个例子是太简化捕捉现实的问题。
我有其在一列不同的排序的两个数据帧。我想匹配的一列,然后从第二列中的值合并。第二列需要留在同一顺序。
所以,我有这样的:
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
我要自己开车傻试图解决这个问题。似乎应该是一个简单的标问题。
解决方案
有几种方法可以做到这一点(它是R,毕竟),但我认为最明显的是建立一个索引。我们需要创建一个顺序索引(从1开始,并用观察次数结束)的函数。
seq_len(3)
> [1] 1 2 3
但是,我们需要计算每个分组变量(状态)内此索引。为此,我们均可以使用的ave
功能。它需要一个数字作为第一个参数,则该分组的因素,最后功能每组中得以应用。
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(注意使用with
的,它告诉R键搜索环境/数据帧中的变量。这比使用S1 $值1,S2 $值2,等更好的做法。)
现在我们可以简单地合并(合并)的两个数据帧(通过存在于两个数据帧中的变量:状态和索引)。
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而不是创建由哈德利建议新的功能]
其他提示
请注意:检查上面的答案第五评论。溶液应
s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))
测试和工作。
不隶属于 StackOverflow