r - 值之间的线性插值
问题描述
我有一个表t,其中 x 和 y 值在 x (列)的每 10 个整数之间隔开value
,例如:
value -20 -10 0 24 40 55
1 100 41700 41700 41700 41700 41800 41700
2 90 40200 40600 40700 40800 40800 40800
3 80 39200 39700 39800 40000 40000 39900
4 70 38200 38800 38800 39000 39100 39000
5 60 37200 37800 37900 38000 38200 38200
6 50 36200 36700 36900 37000 37000 37000
7 40 35400 35900 36200 36300 36300 36400
8 30 34600 35300 35600 35800 35800 35900
9 20 33700 34600 34800 35200 35100 35100
10 10 31600 33700 33800 34000 33900 33900
11 0 30000 30000 26500 30700 30100 30100
现在,表格是 11 行 x 7 列。我的目标是在 0 到 100 之间的每个整数的所有 6 列中线性插入值,以便最终的表是 101 行 x 7 列。
我可以使用以下方法分别插入每一列:
x <- t$value
y <- t$`-20`
plot(x, y, main = "-20 mv", xlab = "soc", ylab = "temp", pch = 20)
points(approx(x, y, xout = 0:100), col ="blue", pch = 1)
任何人都可以建议一种更快的方法,使用dplyr
或data.table
或基本 R 并使用一些命令将其应用于整个表?
数据:
dput(t)
structure(list(value = c(100L, 90L, 80L, 70L, 60L, 50L, 40L,
30L, 20L, 10L, 0L), `-20` = c(41700L, 40200L, 39200L, 38200L,
37200L, 36200L, 35400L, 34600L, 33700L, 31600L, 30000L), `-10` = c(41700L,
40600L, 39700L, 38800L, 37800L, 36700L, 35900L, 35300L, 34600L,
33700L, 30000L), `0` = c(41700L, 40700L, 39800L, 38800L, 37900L,
36900L, 36200L, 35600L, 34800L, 33800L, 26500L), `24` = c(41700L,
40800L, 40000L, 39000L, 38000L, 37000L, 36300L, 35800L, 35200L,
34000L, 30700L), `40` = c(41800L, 40800L, 40000L, 39100L, 38200L,
37000L, 36300L, 35800L, 35100L, 33900L, 30100L), `55` = c(41700L,
40800L, 39900L, 39000L, 38200L, 37000L, 36400L, 35900L, 35100L,
33900L, 30100L)), class = "data.frame", row.names = c(NA, -11L
))
解决方案
与dplyr
您一起可以:
library(dplyr)
t %>% summarise(across(everything(), ~approx(value, ., xout=0:100)$y))
value -20 -10 0 24 40 55 1 0 30000 30000 26500 30700 30100 30100 2 1 30160 30370 27230 31030 30480 30480 3 2 30320 30740 27960 31360 30860 30860 4 3 30480 31110 28690 31690 31240 31240 5 4 30640 31480 29420 32020 31620 31620 ... 95 94 40800 41040 41100 41160 41200 41160 96 95 40950 41150 41200 41250 41300 41250 97 96 41100 41260 41300 41340 41400 41340 98 97 41250 41370 41400 41430 41500 41430 99 98 41400 41480 41500 41520 41600 41520 100 99 41550 41590 41600 41610 41700 41610 101 100 41700 41700 41700 41700 41800 41700
或者在基础 R 中:
do.call(cbind, lapply(t, function(y) {approx(t$value, y, xout=0:100)$y}))
推荐阅读
- django - build_absolute_uri 在反向代理后面使用 HTTPS
- r - 在 X 轴上排列的 ggplot2 图形下方绘制一个单独数据表
- git - Git 存储库混乱
- java - 使用 CircleCI 将带有 Firebase 实现的 REST API 部署到 Heroku
- java - JNA 中的 Oleacc dll 支持
- tensorflow - 使用 Tensorflow,如何将 LSTM 生成的权重加载到 CudnnLSTM 模型中?
- django-models - 如何在 django 管理页面中的每一行的列表页面上放置一个按钮
- jq - 使用 jq 从值中获取键
- pyspark-dataframes - 如何通过比较两个 pyspark 数据帧来获得共同值
- pandas - 熊猫数据列表中的总和值