【发布时间】:2018-10-31 15:41:22
【问题描述】:
这是一个非常具体的问题:我有一组观察结果,来自多个科目,历时数年(每年只有一次观察)。我只想为每个人选择一个观察值(我不在乎哪一年),这样我每年的观察结果数量相似,并且尽可能随机。
因此,从df 开始,其中 1 是对该个人进行观察的年份,而 0 是对该个人没有观察的年份:
df <- data.frame(Ind = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"),
Year1 = c(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
Year2 = c(0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0),
Year3 = c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1),
Year4 = c(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1))
看起来像
我想以这样的方式结束
编辑:尝试应用提出的解决方案(但失败)
(1) 搜索者的回答:
df <- as_tibble(df)
year.weights <- df %>%
gather(Year, Obs, -Ind) %>%
group_by(Year) %>%
summarize(wt = sum(Obs)) %>%
ungroup
df %>%
gather(Year, Obs, -Ind) %>%
filter(Obs == 1) %>%
left_join(year.weights, by = "Year") %>%
group_by(Ind) %>%
sample_n(1, weight = 1 / wt) %>%
select(-wt) %>%
spread(Year, Obs) %>%
ungroup
这会产生错误Error: 'by' can't contain join column 'Year' which is missing from RHS,出现在left_join 步骤中。我尝试通过将名称“Year”赋予 RHS 中唯一的变量来解决这个问题
names(year.weights) <- "Year"
但是现在这给出了一个新错误:Error in left_join_impl(x, y, by_x, by_y, aux_x, aux_y, na_matches) : Can't join on 'Year' x 'Year' because of incompatible types (numeric / character) 这实际上很有意义,因为 LHS 中的 Year 列包含 Year1、Year2、Year3 等,而 RHS 中的 Year 列包含数字 27。
这是我所得到的,因为我看不到 earch 试图完成什么,但我相信通过这个 n_sample 和 weight 参数可以实现一个可行的解决方案,但我还不太清楚.
(2) 米奇的回答:
这很好用(我没有得到我之前遇到的错误),但它不能保证我会为每个“年份”列得到相等(或相似)数量的 1。
所以,如果我运行代码几次进行测试,我会得到:
# first time
[,1] [,2] [,3] [,4]
[1,] 0 0 0 1
[2,] 1 0 0 0
[3,] 0 0 1 0
[4,] 0 1 0 0
[5,] 1 0 0 0
[6,] 0 0 1 0
[7,] 0 0 0 1
[8,] 0 1 0 0
[9,] 0 0 0 1
[10,] 0 0 0 1
[11,] 0 0 0 1
# second time
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 1 0 0 0
[3,] 0 0 1 0
[4,] 0 1 0 0
[5,] 0 0 0 1
[6,] 1 0 0 0
[7,] 1 0 0 0
[8,] 0 0 0 1
[9,] 0 0 0 1
[10,] 0 0 0 1
[11,] 0 0 1 0
(3) Andre Elrico 的回答:
它与答案(2)有相同的问题,它不保证每年有相同数量的 1:查看两个随机输出:
# fist try
Ind Year1 Year2 Year3 Year4
1 a NA NA NA 1
2 b NA NA 1 NA
3 c NA NA 1 NA
4 d NA 1 NA NA
5 e 1 NA NA NA
6 f NA NA 1 NA
7 g 1 NA NA NA
8 h NA NA NA 1
9 i NA NA NA 1
10 j NA NA NA 1
11 k NA NA 1 NA
# second try
Ind Year1 Year2 Year3 Year4
1 a 1 NA NA NA
2 b 1 NA NA NA
3 c NA NA 1 NA
4 d NA NA 1 NA
5 e NA 1 NA NA
6 f NA NA NA 1
7 g NA NA NA 1
8 h NA NA NA 1
9 i NA NA NA 1
10 j NA 1 NA NA
11 k NA NA 1 NA
(4) paoloeusebi 的回答 和前面的问题一样。不保证每行选择的 1 数量相等:
# first try
Ind Year1 Year2 Year3 Year4
1 a 1 NA NA NA
2 b NA NA NA 0
3 c NA NA 1 NA
4 d NA NA NA 0
5 e NA NA 1 NA
6 f NA NA NA 1
7 g 1 NA NA NA
8 h NA NA 0 NA
9 i NA NA NA 1
10 j NA NA NA 1
11 k NA NA 1 NA
# second try
Ind Year1 Year2 Year3 Year4
1 a NA NA NA 1
2 b NA 0 NA NA
3 c NA 1 NA NA
4 d NA NA NA 0
5 e NA NA NA 1
6 f NA 0 NA NA
7 g NA 0 NA NA
8 h NA NA 0 NA
9 i NA NA 0 NA
10 j NA NA 0 NA
11 k NA 0 NA NA
【问题讨论】:
-
您是否只想随机选择值为
1的年份? -
在您的示例中,个人 e 最终有两个观察结果。我认为这是一个错误?
-
Mike 值将始终为 1,因为每年总会有一个 obs。 iod,不,如果有 4 年,但观察次数不是 4 的倍数,这可能会发生。这只会增加问题的复杂性。
-
什么?你说你希望每个人一个观察。观察次数是四的倍数还是不是?我不明白这个问题。并且只有“1”被认为是观察?
-
是的,我可能应该解释得更好,我会编辑它。 “输出”图像中也存在错误。只有 1 是观察值,如果是 0,那一年该个体没有观察到。是的,我想要每个人的 1 个观察值(一个 1),但是以某种方式,我最终每年都会得到相同(或相似)数量的观察值(1 秒)(即结果中的 rowSums矩阵是 c(3, 2, 3, 3) 但 colSums 是 c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)