我确定这是一种非常常见的方法,但我无法准确说明它。我有一个长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)
谢谢。
答案 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
无论是否适合线性插值,我都会留给您...根据您的数据,对数插值可能会更好。