【问题标题】:Merging data sets with unequal observations合并具有不同观测值的数据集
【发布时间】:2014-01-09 10:02:02
【问题描述】:

我有两个数据集,一个是另一个的子集,但该子集有额外的列,观察较少。

基本上,我为每个参与者分配了一个唯一的 ID,然后是一个 HHID,即他们被招募的房子 ID(例如,从 11 个房子招募的 15 个参与者)。

> Healthdata <- data.frame(ID = gl(15, 1), HHID = c(1,2,2,3,4,5,5,5,6,6,7,8,9,10,11))
> Healthdata

现在,我有一个数据子集,每个家庭只有一个参与者,被选中的人看电视时间更长。在这个子集数据中,我计算了每所房子的社会经济分数 (SSE)。

> set.seed(1)
> Healthdata.1<- data.frame(ID=sample(1:15,11, replace=F), HHID=gl(11,1), SSE = sample(-6.5:3.5, 11, replace=TRUE))
> Healthdata.1

现在,我想将子集 (Healthdata.1) 中的 SSE 分配给更大数据 (Healthdata) 的唯一参与者,以便来自同一家的参与者获得相同的分数。

我不能简单地合并这个,因为数据集有不同数量的观察,较大的有 15 个,但子集中只有 11 个。

有没有办法在 R 中做到这一点?我对它很陌生,我对此感到很困惑。

我希望所需的输出如下所示,即来自同一 HHID(房屋)的 ID(参与者)应该具有相同的 SSE 分数。下面的输出只是我需要的一个例子,上面的种子不会给出相同的输出。

 ID HHID SSE
 1    1  -6.5
 2    2  -5.5
 3    2  -5.5
 4    3   3.3
 5    4   3.0
 6    5   2.58
 7    5   2.58
 8    5   2.58
 9    6  -3.05
10    6  -3.05
11    7  -1.2
12    8   2.5
13    9   1.89
14   10   1.88
15   11  -3.02

谢谢。

【问题讨论】:

  • 你能显示所需的输出吗 - 我可以在下面看到不同的答案
  • 它们实际上并没有什么不同。这:merge(Healthdata,Healthdata.1,all.x=TRUE,by='ID') 相当于 join(Healthdata, Healthdata.1, type = "left", by = "ID") 我只是发现 plyr 比合并更直观。
  • @MartínBel,我试过了。但是,它部分起作用。它只合并其中一个参与者,并将 SSE 的值提供给另一个参与者 NA。当两个或多个参与者具有相同的 HHID 时,我希望为来自同一所房子的每个参与者分配相同的 SSE,而不是为一个分配 SSEscore,为另一个分配 NA
  • @PrasannaNanda,谢谢,请查看更新后的问题,以及所需的输出。
  • 6.5 来自哪里?

标签: r merge dataframe


【解决方案1】:

你可以使用merge,默认会按列交叉合并。

merge(Healthdata,Healthdata.1,all.x=TRUE)
   ID HHID SSE
1   1    1  NA
2   2    2  NA
3   3    2  NA
4   4    3  NA
5   5    4  NA
6   6    5  NA
7   7    5  NA
8   8    5  NA
9   9    6 0.7
10 10    6  NA
11 11    7  NA
12 12    8  NA
13 13    9  NA
14 14   10  NA
15 15   11  NA

或者您可以选择合并的列:

merge(Healthdata,Healthdata.1,all.x=TRUE,by='ID')

【讨论】:

  • 也试过了。它只合并其中一个参与者,并将 SSE 的值提供给另一个参与者 NA。当两个或多个参与者具有相同的 HHID 时,我希望为来自同一所房子的每个参与者分配相同的 SSE,而不是为一个分配 SSEscore,为另一个分配 NA。我已经用所需的输出更新了问题。
  • 我不知道 6.5 来自您的输出?您是否使用另一个种子来生成数据?你有没有尝试过 HHID 的 Merhe? merge(Healthdata,Healthdata.1,all.x=TRUE,by='HHID')?
  • 抱歉,所需的输出只是为了展示我希望输出在合并后的样子。
【解决方案2】:

您需要通过HHID 合并,而不是ID。请注意,这有点令人困惑,因为来自超组的 id 来自与来自子组不同的集合。 IE。 ID.x == 4 != ID.y == 4 (实际上,在这种情况下,他们在不同的家庭中)。因此,我将两个 ID 列都留在这里以避免歧义,但您可以轻松地将结果子集以仅显示 ID.x 一个,

> merge(Healthdata, Healthdata.1, by='HHID')
   HHID ID.x ID.y  SSE
1     1    1    4 -5.5
2     2    2    6  0.5
3     2    3    6  0.5
4     3    4    8 -2.5
5     4    5   11  1.5
6     5    6    3 -1.5
7     5    7    3 -1.5
8     5    8    3 -1.5
9     6    9    9  0.5
10    6   10    9  0.5
11    7   11   10  3.5
12    8   12   14 -2.5
13    9   13    5  1.5
14   10   14    1  3.5
15   11   15    2 -4.5

【讨论】:

  • 谢谢。一件小事就会产生巨大的影响。有效。非常感谢你。为了摆脱所有这些 .x,我使用了 join(Healthdata, Healthdata.1, type = "left", by = "HHID")
【解决方案3】:
library(plyr)
join(Healthdata, Healthdata.1)

# Inner Join
join(Healthdata, Healthdata.1, type = "inner", by = "ID")

# Left Join
# I believe this is what you are after
join(Healthdata, Healthdata.1, type = "left", by = "ID")

【讨论】:

  • 我试过这个。但是,它部分起作用。它只合并其中一个参与者,并将 SSE 的值提供给另一个参与者 NA。当两个或多个参与者具有相同的 HHID 时,我希望为来自同一所房子的每个参与者分配相同的 SSE,而不是为一个分配 SSEscore,为另一个分配 NA。我已经用所需的输出更新了问题。
  • 使用连接(Healthdata, Healthdata.1, type = "left", by = "HHID")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2021-11-14
  • 1970-01-01
  • 2019-12-28
  • 2021-07-13
  • 2016-09-09
相关资源
最近更新 更多