通过使用查找表和线性插值添加data.frame列

时间:2018-11-26 20:28:05

标签: r tidyverse

我确定这是一种非常常见的方法,但我无法准确说明它。我有一个长data.frame,其中包含三列:date_time列,一个数字列(df$property1)和一个字符串列。

我还有另一个data.frame作为查找表,提供了“ property1”和另一个数字属性“ property2”之间的关系。

我想向df$property2添加一个df列,这是根据查询表的property1和property2关系使用df$property1的线性插值的近似结果。例如,如果df$property1恰好是10,df$property2会是20,或者如果df$property1恰好是145,则df$property2可能会低于1500

我希望学习如何有效地创建df$property2,并对学习tidyverse和非tidyverse方法感兴趣。

library(tidyverse)

# create example data frame needing new column
date_time <- seq(from=as.POSIXct("2015-12-10 12:00", tz="GMT"), 
to=as.POSIXct("2015-12-10 18:00", tz="GMT"), by="1 hours") 
property1 <- c(1,45,12,99, 105,3,149)
df1 <- data.frame(date_time, property1) %>% mutate(class = "a")
property1 <- c(50,10,66,147, 11,190,80)
df2 <- data.frame(date_time, property1) %>% mutate(class = "b")
df <- rbind(df1, df2)

# create example look up table
property1_lookup <- c(1,     10, 15, 50,  100, 150,  99999)
property2_lookup <- c(0.001, 20, 30, 100, 500, 1500, 1501)
lookup <- data.frame(property1_lookup, property2_lookup)

谢谢。

1 个答案:

答案 0 :(得分:2)

我认为这很简单:

df$property2 = approx(x = lookup$property1_lookup,
                      y = lookup$property2_lookup,
                      xout = df$property1)$y
head(df)
#             date_time property1 class  property2
# 1 2015-12-10 12:00:00         1     a   0.001000
# 2 2015-12-10 13:00:00        45     a  90.000000
# 3 2015-12-10 14:00:00        12     a  24.000000
# 4 2015-12-10 15:00:00        99     a 492.000000
# 5 2015-12-10 16:00:00       105     a 600.000000
# 6 2015-12-10 17:00:00         3     a   4.445222

无论是否适合线性插值,我都会留给您...根据您的数据,对数插值可能会更好。