【问题标题】:Subtract values in dataframe based on condition from another dataframe根据来自另一个数据帧的条件减去数据帧中的值
【发布时间】:2019-01-30 03:42:19
【问题描述】:

我有一个数据框,其中包含一组网站在不同年份和月份的 AHD 值。我有另一个数据框,其中包含每个站点最多 4 个地块的高程数据。我需要从每个湿地中每个地块的高程中减去测量的 AHD。这是一个庞大的数据集,所以我一直在尝试使用循环来最小化所需的代码量。

我一直在尝试使用嵌套循环从一个数据帧中提取值以从另一个数据帧中减去。我似乎无法让它工作。

# Example data
Dates <- rep(seq(as.Date("1/1/2010"), by = "month", length.out = 24),5)
Site <- rep(letters[1:5], each=24)
AHD <- runif(120, min = 12, max = 50)
df1 <- data.frame(cbind(as.Date(Dates), Site, AHD))
df1$AHD <- as.numeric(df1$AHD)

Site <- rep(letters[1:5], each=4)
Plot <- rep(LETTERS[seq( from = 1, to = 4 )],5)
elv <- runif(20, min = 12, max = 50)
df2 <- data.frame(cbind(Site, Plot, elv))
df2$elv <- as.numeric(df2$elv)

我所追求的是一个 data.frame,其中包含每个站点的每个地块的调整后的 AHD 值。生成的 data.frame 将包含 'data'、'site'、'plot' 和 'adjAHD' 列,其中 'adjAHD' = df1$AHD - df2$elv。该数据框将有 600 (120 x 5) 行,因为每个站点的每个日期都将被复制到四个地块。

【问题讨论】:

  • 您的示例在公共列“站点”中有重复的条目,否则,merge 或加入会做到这一点
  • 嗯...也许我没有问清楚这个问题。我需要创建一个全新的数据框,该数据框将使用 df2 中的 elv 值来计算每个站点每个时间点的每个地块的新 adjAHD 值。

标签: r loops


【解决方案1】:

使用akrun解释的方法:

df3 <- merge(df1, df2, by = "Site")
df3$adjAHD <- df3$AHD - df3$elv

head(df3)
# Site      V1 AHD Plot elv adjAHD
# 1    a -719143  86    A   4     82
# 2    a -719143  86    B  15     71
# 3    a -719143  86    C  17     69
# 4    a -719143  86    D   9     77
# 5    a -719112  45    A   4     41
# 6    a -719112  45    B  15     30

dim(df3)
# [1] 480   6

【讨论】:

  • 旁注(120 x “四个地块”)= 480
  • 非常感谢!一个问题。为什么合并后elv值会发生变化?
  • 他们没有,只是数据的排序与您预期的不同。
  • 好的。非常感谢
  • df3 &lt;- df3[order(df3$V1),]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多