【问题标题】:merge data frame with repeated observations合并具有重复观察的数据框
【发布时间】:2016-09-09 18:44:03
【问题描述】:

我有两个数据框:

df1 <- data.frame(index = c(rep(2,5), rep(3,8), rep(4,6), rep(5,9)),
              start = c(0:4, 0:7, 0:5, 0:8),
              end = c(1:5, 1:8, 1:6, 1:9),
              v1= rep(1,28))


df2 <- data.frame(index = c(rep(2,5), rep(3,7), rep(4,6), rep(5,6)),
              v1 = rnorm(24))

假设index 列代表一个人的不同观察。 在df1 的这个例子中,我们有一个 id 为 2 和 5 观察的人, id 为 3 的人有 8 个观察值,依此类推。

我现在想用df2 中的v1 值替换df1v1 的值。 df2 的观测值有时比 df1 少,例如适用于 3 和 5 人。

合并的方式应该是 df2 的 v1 被用于第一次观察,如果没有更多的观察可用,则应该替换 NAs。

应保留 df1 框架的结构,但应将 v1 替换为 df2 中的结构。

【问题讨论】:

  • 您如何知道第一个数据集中的哪些行将第二个数据集中的信息放在其中?它只是基于数据集的顺序(所以组末尾的任何 NA)?
  • @aosmith 确切地说,NA 应该在每个组的末尾,

标签: r merge dplyr


【解决方案1】:

要通过连接来实现这一点,您需要一个组内索引,这样您就有一个唯一的标识符来匹配。

如果df2 的顺序已经正确,则创建此方法很简单,因此加入后的任何 NA 值都应位于每个组的末尾。您可以将end 变量添加到df2 并加入indexend

我还从第一个数据集 df1 中删除了 v1

library(dplyr)
df2 %>%
    group_by(index) %>%
    mutate(end = 1:n()) %>%
    left_join(select(df1, -v1), .)

   index start end          v1
1      2     0   1 -1.57254316
2      2     1   2 -1.09000063
3      2     2   3 -0.13775401
4      2     3   4 -0.94088741
5      2     4   5  0.45180766
6      3     0   1  2.14925746
7      3     1   2  1.79103360
8      3     2   3 -0.28344963
9      3     3   4 -0.10250375
10     3     4   5  0.21321949
11     3     5   6  0.07982287
12     3     6   7  0.37987963
13     3     7   8          NA
14     4     0   1  0.41360521
15     4     1   2 -0.28888575
16     4     2   3 -0.58786830
17     4     3   4  0.14340062
18     4     4   5  1.46434162
19     4     5   6  1.73668914
20     5     0   1  1.43112233
21     5     1   2  0.40772442
22     5     2   3 -1.77085141
23     5     3   4 -0.94653948
24     5     4   5 -1.54412791
25     5     5   6 -0.28174510
26     5     6   7          NA
27     5     7   8          NA
28     5     8   9          NA

正如@SteveBeaupre 在 cmets 中所指出的,您可以用row_number() 替换我以前的1:n() 习惯。

【讨论】:

  • 你可以用row_number()替换1:n()
  • @StevenBeaupré,因为出于某种原因,输入越多越好?
  • @eddi 不是更好,但也许更惯用
  • @StevenBeaupré 我不知道这意味着什么,或者它的价值是什么。从我的角度来看,它只是看起来像更多的字母,没有其他任何附加值,实际上价值被减去了,因为现在必须花时间记住一个新功能(这是我对所有 dplyr 的普遍看法)。
  • @eddi 是的,我明白你的意思。 data.table 1:.Ndplyr 等效的 1:n() 非常好。我认为row_number() 背后为分区内的每一行分配唯一编号的想法可能是模仿SQL 的行为。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2015-07-25
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多