按组查找数据集中每个变量的差异(减法)

时间:2014-10-21 19:23:34

标签: r date dataframe data.table plyr

我有一个包含大约20个变量的数据集。数据是在三年(2012-2014)期间收集的,每年的观察结果可以按SitePlot进行分组。

我想找出年之间每次观察的差异(即值的变化)。自从我在2012年开始收集数据以来,我想找到2013年和2012年之间的差异,以及2014年和2013年(2014年至2012年,也将受到欢迎)。

首先,我尝试用plyrdata.table尝试找出一个变量之间的差异。这些都没有成功。我不确定如何在按YearSite进行分组时调用Plot减去{}的操作。而且,我不知道在哪里存放它。

我已经包含了一个只有3个变量的样本数据集。我还提供了一个所需的输出样本(output),但格式并不重要。我对价值观更感兴趣。

如果ddplydata.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))

2 个答案:

答案 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)

像这样的Smth?

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