注意: 我改变从当我先贴的例子。第一个例子是太简化捕捉现实的问题。

我有其在一列不同的排序的两个数据帧。我想匹配的一列,然后从第二列中的值合并。第二列需要留在同一顺序。

所以,我有这样的:

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))

测试和工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top