【问题标题】:How to Mutate a Dichotomous Variable Based on The Yearly Mean of Another Variable in R?如何根据 R 中另一个变量的年均值来改变二分变量?
【发布时间】:2019-11-23 18:24:53
【问题描述】:

我想知道这里的用户将如何根据另一个变量中的值是高于还是低于该变量的年平均值来在数据框中创建一个新的二分变量。我已经尝试检查类似的答案,但是虽然我发现了使用聚合函数在数据框中的组上生成均值的建议,但这并不能完全满足我在这种情况下的需求。

具体来说,我有一个空间滞后变量(已经构建),并且我想创建一个二分变量来捕获一个状态(id = COW)是高于还是低于我的空间滞后变量的年度平均值。

这不是我正在使用的实际数据,而是应该传达数据结构的简化版本。不用说,实际数据框中还有许多其他协变量和状态。年份变量由离散间隔组成,包括 1967 年至 2018 年(含)的所有年份。就其他信息而言,所有年份的州数量并不相等,因为我在它们正式进入(例如,南苏丹在 1967 年后进入)之前或在它们正式退出国际国家体系之后(例如捷克斯洛伐克):

COW     Year        SL_UN_ICCPR         
2       1967        0   
20      1967        0   
31      1967        0   
40      1967        0
... 
2       1968        0   
20      1968        1.2 
31      1968        1.5
...
2       1980        4.6 
20      1980        3.7 
31      1980        3.0
... 
900     2018        5.10        
910     2018        2.6         
920     2018        1.5     

我想产生这样的输出:

COW     Year        SL_UN_ICCPR     Dichotomous 
2       1967        0                      0
20      1967        0                      0
31      1967        0                      0
40      1967        0                      0
... 
2       1968        0                      0
20      1968        1.2                    0
31      1968        1.5                    1 #(assuming yearly mean = 1.4)
...
2       1980        4.6                    1 
20      1980        3.7                    1
31      1980        3.0                    0  #(assuming yearly mean = 3.1)
... 
40      2018        5.10                   1
42      2018        2.6                    0 #(assuming yearly mean = 3.2)
51      2018        1.5                    0

我尝试使用 group_by 按年份对数据进行分组,但以下代码没有产生预期的结果:

Data <- group_by(Data, Year)
Data <- mutate(Data, Spatial_Dummy_ICCPR = ifelse(SL_UN_ICCPR > mean(SL_UN_ICCPR) , 1, 0))

这会产生一个二分变量,而无需按年份进行分组,而是根据整体变量均值进行变异。谁能给我一些关于我哪里出错的方向?

【问题讨论】:

  • 似乎对我有用。或许可以尝试 df &lt;- mutate(df, yearly_avg = mean(SL_UN_ICCPR), Spatial_Dummy_ICCPR = ifelse(SL_UN_ICCPR &gt; mean(SL_UN_ICCPR), 1, 0)) 作为您的第二步,以帮助验证比较是按年份进行的。

标签: r time-series grouping dplyr


【解决方案1】:

您需要先按年份创建平均值,然后取消分组,最后创建虚拟对象。像这样的东西应该可以工作:

library(tidyverse)
Data %>%
group_by(Year)%>%
mutate(avg_year = mean(SL_UN_ICCPR))%>%
ungroup()%>%
mutate(Spatial_Dummy_ICCPR = ifelse(SL_UN_ICCPR > avg_year , 1, 0))

【讨论】:

    【解决方案2】:

    您可以使用基本 R 的 ave 创建一个具有年度平均值的变量,您可以在该变量上应用 ifelse,方便地在 within 中。

    d <- within(d, { 
      SL_UN_ICCPR.mean=ave(SL_UN_ICCPR, Year, FUN=mean)
      Spatial_Dummy_ICCPR=ifelse(SL_UN_ICCPR > SL_UN_ICCPR.mean, 1, 0)
    })
    #    COW Year SL_UN_ICCPR Spatial_Dummy_ICCPR SL_UN_ICCPR.mean
    # 1    2 1967         0.0                   0         0.000000
    # 2   20 1967         0.0                   0         0.000000
    # 3   31 1967         0.0                   0         0.000000
    # 4   40 1967         0.0                   0         0.000000
    # 5    2 1968         0.0                   0         0.900000
    # 6   20 1968         1.2                   1         0.900000
    # 7   31 1968         1.5                   1         0.900000
    # 8    2 1980         4.6                   1         3.766667
    # 9   20 1980         3.7                   0         3.766667
    # 10  31 1980         3.0                   0         3.766667
    # 11 900 2018         5.1                   1         3.066667
    # 12 910 2018         2.6                   0         3.066667
    # 13 920 2018         1.5                   0         3.066667
    

    数据

    d <- structure(list(COW = c(2L, 20L, 31L, 40L, 2L, 20L, 31L, 2L, 20L, 
    31L, 900L, 910L, 920L), Year = c(1967L, 1967L, 1967L, 1967L, 
    1968L, 1968L, 1968L, 1980L, 1980L, 1980L, 2018L, 2018L, 2018L
    ), SL_UN_ICCPR = c(0, 0, 0, 0, 0, 1.2, 1.5, 4.6, 3.7, 3, 5.1, 
    2.6, 1.5)), row.names = c(NA, -13L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 2021-06-14
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多