我有一个包含大约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))
答案 0 :(得分:1)
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)允许滞后矢量。 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
。
答案 1 :(得分:1)
cols = c('V1', 'VH1', 'V2')
dt[, paste0(cols, 'diff') := lapply(.SD, function(x) c(NA, diff(x))),
by = list(Site, Plot), .SDcols = cols][]
# Site Plot Year V1 VH1 V2 V1diff VH1diff V2diff
# 1: 1.0 1 2012 1 2 3 NA NA NA
# 2: 1.0 2 2012 1 2 3 NA NA NA
# 3: 2.0 1 2012 1 2 3 NA NA NA
# 4: 2.0 2 2012 1 2 3 NA NA NA
# 5: 2.0 3 2012 1 2 3 NA NA NA
# 6: 3.2 1 2012 1 2 NA NA NA NA
# 7: 3.2 2 2012 1 2 3 NA NA NA
# 8: 3.2 3 2012 1 2 3 NA NA NA
# 9: 3.2 4 2012 1 2 3 NA NA NA
#10: 1.0 1 2013 0 4 0 -1 2 -3
#11: 1.0 2 2013 0 4 0 -1 2 -3
#12: 2.0 1 2013 0 4 0 -1 2 -3
#13: 2.0 2 2013 0 4 0 -1 2 -3
#14: 2.0 3 2013 0 4 0 -1 2 -3
#15: 3.2 1 2013 0 4 0 -1 2 NA
#16: 3.2 2 2013 0 4 0 -1 2 -3
#17: 3.2 3 2013 0 4 0 -1 2 -3
#18: 3.2 4 2013 0 4 0 -1 2 -3
#19: 1.0 1 2014 5 10 20 5 6 20
#20: 1.0 2 2014 5 10 20 5 6 20
#21: 2.0 1 2014 5 NA 20 5 NA 20
#22: 2.0 2 2014 5 10 20 5 6 20
#23: 2.0 3 2014 5 10 20 5 6 20
#24: 3.2 1 2014 5 10 20 5 6 20
#25: 3.2 2 2014 5 10 20 5 6 20
#26: 3.2 3 2014 5 10 20 5 6 20
#27: 3.2 4 2014 5 10 20 5 6 20
# Site Plot Year V1 VH1 V2 V1diff VH1diff V2diff