【问题标题】:Mixed Merge in R - Subscript solution?R中的混合合并 - 下标解决方案?
【发布时间】:2010-11-21 01:36:19
【问题描述】:

注意: 我更改了第一次发布时的示例。我的第一个示例过于简单,无法捕捉到真正的问题。

我有两个数据框,它们在一列中以不同的方式排序。我想匹配一列,然后合并第二列的值。第二列需要保持相同的顺序。

所以我有这个:

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

为了解决这个问题,我快要把自己逼疯了。似乎它应该是一个简单的下标问题。

【问题讨论】:

  • 这个例子怎么样?例如,在这种情况下,状态 ID 始终匹配相同的值 1(IA == 2,IL == 1),因此只要状态 ID 在与 s1 相同。如果 value1 是 1:6,那就完全不同了。
  • 非常好。我过度简化了我的例子。 IA 并不总是 ==2,所以它太简单了。我将编辑我的问题。

标签: r merge subscript


【解决方案1】:

有几种方法可以做到这一点(毕竟是 R),但我认为最清楚的是创建索引。我们需要一个创建顺序索引的函数(从一个开始到观察数结束)。

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等更好)

现在我们可以简单地合并(连接)两个数据帧(通过两个数据帧中存在的变量:状态和索引)。

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 的建议创建新函数。]

【讨论】:

  • 考虑到无限数量的猴子和无限数量的计算机,我仍然无法想出这个。非常感谢!
  • 这 3 行是怎么回事?你能详细说明一下吗?
  • 您可以将FUN=function(x) 1:length(x)) 替换为seq_len
  • 是的,seq_len 正是您的 getIndex 函数。
【解决方案2】:

注意:检查上述答案的第 5 条评论。解决方案应该是

s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))

经过测试并且可以正常工作。

【讨论】: