我正在尝试为以下示例数据插入样条:

trt    depth    root    carbon
A       2        1        14
A       4        2        18
A       6        3        18
A       8        3        17
A      10        1        12
B       2        3        16
B       4        4        18
B       6        4        17
B       8        2        15
B      10        1        12

通过以下方式:
new_df<-df%>%
  group_by(trt)%>%
  summarise_each(funs(splinefun(., x=depth, method="natural")))

我得到一个 Error: not a vector ,但我不明白为什么不。我没有以正确的方式表达功能吗?

最佳答案

你想要一个包含内插值的数据集吗?如果是这样,在计算样条曲线之前,我已经扩展了数据集以包含所需的 x 位置。

这些点的分辨率在 expand.grid() 函数的第二行中确定。只要确保原始深度点是扩展深度点的子集(例如,不要使用像 by=.732 这样不均匀的东西)。

library(magrittr)
ds <- readr::read_csv("trt,depth,root,carbon\nA,2,1,14\nA,4,2,18\nA,6,3,18\nA,8,3,17\nA,10,1,12\nB,2,3,16\nB,4,4,18\nB,6,4,17\nB,8,2,15\nB,10,1,12")

ds_depths_possible <- expand.grid(
  depth            = seq(from=min(ds$depth), max(ds$depth), by=.5), #Decide resolution here.
  trt              = c("A", "B"),
  stringsAsFactors = FALSE
  )

ds_intpolated <- ds %>%
  dplyr::right_join(ds_depths_possible, by=c("trt", "depth")) %>% #Incorporate locations to interpolate
  dplyr::group_by(trt) %>%
  dplyr::mutate(
    root_interpolated     = spline(x=depth, y=root  , xout=depth)$y,
    carbon_interpolated   = spline(x=depth, y=carbon, xout=depth)$y
  ) %>%
  dplyr::ungroup()
ds_intpolated

输出:
Source: local data frame [34 x 6]

     trt depth  root carbon root_interpolated carbon_interpolated
   (chr) (dbl) (int)  (int)             (dbl)               (dbl)
1      A   2.0     1     14          1.000000            14.00000
2      A   2.5    NA     NA          1.195312            15.57031
3      A   3.0    NA     NA          1.437500            16.72917
4      A   3.5    NA     NA          1.710938            17.52344
5      A   4.0     2     18          2.000000            18.00000
6      A   4.5    NA     NA          2.289062            18.21094
7      A   5.0    NA     NA          2.562500            18.22917
8      A   5.5    NA     NA          2.804688            18.13281
9      A   6.0     3     18          3.000000            18.00000
10     A   6.5    NA     NA          3.132812            17.88281
..   ...   ...   ...    ...               ...                 ...

r - 在 dplyr 中插入样条-LMLPHP
r - 在 dplyr 中插入样条-LMLPHP

在上图中,小点和线是内插的。观察到大的脂肪点。
library(ggplot2)
ggplot(ds_intpolated, aes(x=depth, y=root_interpolated, color=trt)) +
  geom_line() +
  geom_point(shape=1) +
  geom_point(aes(y=root), size=5, alpha=.3, na.rm=T) +
  theme_bw()

ggplot(ds_intpolated, aes(x=depth, y=carbon_interpolated, color=trt)) +
  geom_line() +
  geom_point(shape=1) +
  geom_point(aes(y=carbon), size=5, alpha=.3, na.rm=T) +
  theme_bw()

如果你想要一个额外的例子,这里有一些最近的 codeslides 。我们需要一些缺失点的滚动中位数,以及一些其他点的线性 stats::approx()。另一个选项也是 stats::loess() ,但它的参数不像 approx()spline()

关于r - 在 dplyr 中插入样条,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34687142/

10-12 20:20