我想知道这里的用户如何根据另一个变量的值是高于还是低于该变量的年平均值在数据框中创建一个新的二分变量。我曾尝试检查类似的答案,但是当我发现使用聚合函数在数据帧中的组上生成均值的建议时,在这种情况下并不能完全满足我的需求。
具体来说,我有一个空间滞后变量(已经构造),我想创建一个二分变量,以捕获状态(id = COW)是高于还是低于我的空间滞后变量的年平均值。
这不是我正在使用的实际数据,而是应该传达数据结构的简化版本。不用说,实际数据框中还有许多其他协变量和状态。 Year变量由包含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将Year的数据分组,但是以下代码未产生预期的结果:
Data <- group_by(Data, Year)
Data <- mutate(Data, Spatial_Dummy_ICCPR = ifelse(SL_UN_ICCPR > mean(SL_UN_ICCPR) , 1, 0))
这将产生一个二分变量,但没有按年份分组,而是根据整体变量平均值进行了变异。谁能给我一些指导我出问题的地方?
答案 0 :(得分:0)
您需要首先按年份创建平均值,然后取消分组,最后创建您的虚拟对象。这样的事情应该起作用:
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))
答案 1 :(得分:0)
您可以使用基数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")