【问题标题】:Find difference (subtraction) for each variable in dataset by group按组查找数据集中每个变量的差异(减法)
【发布时间】:2014-10-21 19:23:34
【问题描述】:

我有一个包含大约 20 个变量的数据集。数据收集了三年(2012-2014),每年的每个观察都可以按SitePlot分组。

我想找出不同年份之间每次观察的差异(即价值变化)。自从我在 2012 年开始收集数据以来,我想找出 2013 年和 2012 年以及 2014 年和 2013 年之间的区别(2014 - 2012 年,也欢迎)。

首先,我对plyrdata.table 进行了一些尝试,试图找出一个变量的年份差异。这些都没有成功。我不确定如何在按SitePlot 分组时调用一个操作来减去Year。此外,我不知道在哪里存储它。

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

如果ddplydata.table 看起来是不错的选择,我会很感激一些建议。如果它们似乎是这项工作的错误工具,我也会很感激这些信息。虽然此处未包含,但完整日期 (YYYY-mm-dd) 可以包含在数据集中。 Site 中的所有 Plots 都是在给定年份的同一天和同一个月观察到的。

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

【问题讨论】:

    标签: r date dataframe data.table plyr


    【解决方案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 中查看其他规范。您可以在 funs 中指定多个函数;您还可以指定新的后缀。

      dplyr 中的函数 lag(参见 ?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

    【讨论】:

    • 你的解决方案应该以library(dplyr)开头吗?
    • 以上将给出2014-2012年的答案。是否可以针对上述要求的差异进行操作?如果可能,对这行代码 mutate_each(funs(.-lag(., order_by = Year, n = 2)), -Year) 的解释会有所帮助,第一次使用 dplyr
    【解决方案2】:

    像这样吗?

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多