【问题标题】:dplyr mutate using value from a subset of separate data framedplyr 使用来自单独数据帧子集的值进行变异
【发布时间】:2016-03-27 06:31:49
【问题描述】:

给定以下两个示例数据框:

set.seed(2299)
df1 <- data.frame(site = c("site1","site1","site1","site2","site2","site2"),
                  A0 = rnorm(6),B0 = rnorm(6))
df2 <- data.frame(site = c("site1", "site2"),
                  A0dir = c(220, 110), B0dir = c(310,200))

我如何使用 df2 中的 A0dir 值,而我正在使用 dplyr 进行变异的行中的 df2$site == df1$site

以下不起作用。

df1 %>% 
      mutate(disp = df2$A0dir[site == df2$site] + A0/B0)

以下是"site1" 的正确答案,但我需要它适用于所有网站。

df1 %>% 
      mutate(disp = df2$A0dir["site1" == df2$site] + A0/B0)

以下两个都产生Error: not compatible with STRSXP

df1 %>% 
      mutate(disp = subset(df2, site == .$site, select = A0dir))    

df1 %>% 
      mutate(disp = subset(df2, site == "site1", select = A0dir))

实际上,df1 要大得多,我试图避免完成将A0dirB0dir 变量从df2 引入df1 的连接。

【问题讨论】:

  • df1 %&gt;% left_join(df2) %&gt;% mutate(disp = A0dir + A0/B0)

标签: r dplyr subset


【解决方案1】:

我们可以在mutate() 中使用match()

df1 %>% mutate(disp = df2$A0dir[match(site, df2$site)] + A0/B0)
#   site         A0         B0     disp
#1 site1 -1.5784780  0.1712790 210.7842
#2 site1  1.0957047  0.6394951 221.7134
#3 site1 -1.3443118  0.1814845 212.5927
#4 site2  1.0674512  0.7809774 111.3668
#5 site2  1.3821173  1.7001376 110.8129
#6 site2 -0.1283199 -0.7093244 110.1809

【讨论】:

  • 效果很好!谢谢mtoto。还使用paste() 处理多个匹配项。
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2019-02-05
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多