我有大约20个变量的数据集。数据是在三年(2012-2014年)内收集的,每年每个观察值都可以按Site
和进行分组Plot
。
我想找出几年之间每次观察的差异(即价值变化)。自2012年开始收集数据以来,我想找出2013年与2012年之间以及2014年与2013年之间的区别(2014年-2012年也将受到欢迎)。
首先,我对两者进行了一些尝试,plyr
并data.table
试图找出仅一个变量的年份之间的差异。这些都没有成功。我不确定如何Year
在按Site
和分组时调用减法运算Plot
。而且,我不确定在哪里存储它。
我提供了一个仅包含3个变量的示例数据集。我还提供了示例所需的输出(output
),但是格式并不重要。我对这些价值观更感兴趣。
如果ddply
或data.table
似乎是不错的选择,我将不胜感激。如果它们似乎是错误的工作工具,那么我也希望获得这些信息。尽管此处未包含完整日期,但完整日期(YYYY-mm-dd)可以包含在数据集中。Plot
在Site
给定年份的同一天和同一月观察到内的所有。
require(plyr)
require(data.table)
# df data.frame
df <- structure(list(Site = c(1, 1, 2, 2, 2, 3.2, 3.2, 3.2, 3.2, 1,
1, 2, 2, 2, 3.2, 3.2, 3.2, 3.2, 1, 1, 2, 2, 2, 3.2, 3.2, 3.2,
3.2), Plot = c(1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 1L,
2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 4L),
Year = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L,
2012L, 2012L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L,
2013L, 2013L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L,
2014L, 2014L), V1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L), VH1 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 10L, 10L, NA, 10L, 10L,
10L, 10L, 10L, 10L), V2 = c(3L, 3L, 3L, 3L, 3L, NA, 3L, 3L,
3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 20L, 20L, 20L, 20L,
20L, 20L, 20L, 20L, 20L)), .Names = c("Site", "Plot", "Year",
"V1", "VH1", "V2"), row.names = c(NA, -27L), class = "data.frame")
# as data.table
dt <- as.data.table(df)
# ddply attempt for just one variable: V1
ans.d <- ddply(df, .(Year, Site, Plot), transform, V1.1213=c(NA,diff(V1)))
# data.table attempt for just one variable: V1
KEY <- c("Year", "Site", "Plot")
setkeyv(dt, KEY)
ans.dt <- dt[,diff:=c(NA,diff(V1)),by=KEY]
ans.dt1 <- dt[, c('V1.1','V1.1213') := list(V1[1], V1 - V1[1]),by = KEY]
# data table attempt with diff key
KEY2 <- c("Site", "Plot")
setkeyv(dt, KEY2)
ans.dt.k2 <- dt[,diff:=c(NA,diff(V1)),by=Year]
# example solution
# where V1.1213 is [(V1, Year = 2013) - (V1, Year = 2012)], etc.
output <- structure(list(Site = c(1, 1, 2, 2, 2, 3.2, 3.2, 3.2, 3.2, 1,
1, 2, 2, 2, 3.2, 3.2, 3.2, 3.2, 1, 1, 2, 2, 2, 3.2, 3.2, 3.2,
3.2), Plot = c(1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 1L,
2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 4L),
Year = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L,
2012L, 2012L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L,
2013L, 2013L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L,
2014L, 2014L), V1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L), VH1 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 10L, 10L, NA, 10L, 10L,
10L, 10L, 10L, 10L), V2 = c(3L, 3L, 3L, 3L, 3L, NA, 3L, 3L,
3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 20L, 20L, 20L, 20L,
20L, 20L, 20L, 20L, 20L), V1.1213 = c(NA, NA, NA, NA, NA,
NA, NA, NA, NA, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L,
NA, NA, NA, NA, NA, NA, NA, NA, NA), V1.1314 = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), VH1.1213 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, NA, NA, NA, NA, NA, NA, NA, NA, NA), VH1.1314 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 6L, 6L, NA, 6L, 6L, 6L, 6L, 6L, 6L), V2.1213 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, -3L, -3L, -3L, -3L, -3L,
NA, -3L, -3L, -3L, NA, NA, NA, NA, NA, NA, NA, NA, NA), V2.1314 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L)), .Names = c("Site",
"Plot", "Year", "V1", "VH1", "V2", "V1.1213", "V1.1314", "VH1.1213",
"VH1.1314", "V2.1213", "V2.1314"), class = "data.frame", row.names = c(NA,
-27L))
library(dplyr)
fun <- funs(
lag1 = .-lag(., order_by = Year, n = 1),
lag2 = .-lag(., order_by = Year, n = 2)
)
df %>%
group_by(Site, Plot) %>%
mutate_each(fun, -Year)
一些解释:
mutate_each
将参数“ funs()”中指定的函数应用于最后一个参数中指定的变量。将输入data.frame分组(使用group_by
)时,它将在每个组中应用该功能。该参数funs(.-lag(., order_by = Year, n = 2))
指定要应用于各列的函数。您可以在中查看其他规范?funs
。您可以有趣地指定多个功能;您还可以指定新的后缀。
该函数lag
在dplyr
(见?滞后)允许滞后的载体。lag
有两个选择。第一个是,如果需要order_by
,可以对在中指定的变量进行重新排序order_by
。第二个,n
指定要滞后的时间段数。例如
lag(c(1,2,3))
lag(c(1,2,3), order_by = c(2, 1, 3), n = 1)
我写了order_by = Year
,但是如果数据集已经排序(例如在示例中),则不需要它。
最后一个参数-Year,
将函数应用于除Year以外的所有变量。请参阅?select
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句