【问题标题】:Join and match two data frames in R加入并匹配 R 中的两个数据框
【发布时间】:2020-12-02 04:00:02
【问题描述】:

我有两个数据框。第一个数据框包括:四列 1) ID、2) 站点、3) 深度和 3) 密度。第二个数据框由 3 列组成:1) ID、2) 站点和 3) 选择(即最喜欢的站点)。

df1

  ID  Site Depth Density      
  1     B   0.1       0
  2     C   0.2       0
  3     C   0.2       1
  4     A  0.05       0
  5     A  0.05       1
  6     B   0.1       1
  7     B   0.1       2
  8     B   0.1       3
  9     D   0.3       0
 10     C   0.2       2
 11     D   0.3       1
 12     D   0.3       2
 13     D   0.3       3
 14     D   0.3       4
 15     D   0.3       5

df 2

     ID     Site   Choices
      1       A     No
      1       B     Yes
      1       C     No
      1       D     No
      2       A     No
      2       B     No
      2       C     Yes
      2       D     No
      3       A     No
      3       B     No
      3       C     Yes
      3       D     No
      4       A     Yes
      4       B     No
      4       C     No
      4       D     No

我正在尝试向 df2 添加一列,当 ID 选择其最喜欢的站点时,该列具有每个站点的每个 ID 的密度。

期望的输出:

     ID     Site   Depth  Density    Choice
      1       A      0.05     0         No
      1       B      0.1      0         Yes
      1       C      0.2      0         No
      1       D      0.3      0         No
      2       A      0.05     0         No
      2       B      0.1      1         No
      2       C      0.2      0         Yes
      2       D      0.3      0         No
      3       A      0.05     0         No
      3       B      0.1      0         No
      3       C      0.2      1         Yes
      3       D      0.3      0         No
      4       A      0.05     0         Yes
      4       B      0.1      1         No
      4       C      0.2      2         No
      4       D      0.3      0         No

df2说明:ID 1选择站点B时,站点A、B、C、D的密度为0。ID 2选择C时,站点A的密度为0,站点B 1,站点C 0,站点 D 0。当 ID 3 选择站点 C 时,A 中的密度仍然为 0(还没有 ID 选择站点 A),B 为 1,C 为 1,站点 D 为 0,依此类推。

我尝试过使用完整的连接函数和变异函数,但没有得到我想要的输出:

           df3<-df2 %>%
           full_join(df1, by = c("ID", "Site")) %>%
           group_by(ID) %>%
           mutate(Density= Density[Choice == "Yes"] ) %>%
           distinct(ID, Site, .keep_all = TRUE)

【问题讨论】:

  • 我认为您打错字了 - 您想要的输出 ID 3 站点 B 显示的密度为 0,但您的文字显示 “当 ID 3 选择站点 C 时,... B 有 1"。我认为你的文字是正确的,你想要的输出是错误的,但我想检查以确保我理解。

标签: r join match dplyr


【解决方案1】:

我认为Density 是有多少组选择了每个站点的总和。要计算它,我会这样做:

df3 <- df2 %>%
  full_join(df1, by = c("ID", "Site")) %>%
  arrange(ID, site) %>%  ## make sure IDs are in ascending order
  group_by(Site) %>%
  mutate(Density = cumsum(Choice == "Yes"))

【讨论】:

  • 我没有运气按升序排列 ID。我已经使用了排序功能和“desc”。
  • arrange(ID, site) 按升序排列 ID。我的评论是说明那行代码的目的,而不是给你一个待办事项。你不需要添加任何东西,使用sort,尤其是desc,它用于desc结束顺序——与你想要的相反。
  • 谢谢!在某一时刻,我仍然遇到问题,但我通过在数据框中排列 ID 来解决它,然后再将其放入您的 full_join 模拟。
  • @Gregor Thomas 快速提问:有没有办法在模拟中返回一个时间戳?匹配密度时,我似乎是一个人?
  • 试试Density = pmax(0, cumsum(Choice == "Yes") - 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2020-01-21
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多