У меня есть набор данных, который включает в себя результат голосования r
для каждого избирателя v
по конкретному решению d
. Мои данные, таким образом, выглядят так:
d <- c(1,1,1,1,2,2,2,2,3,3,3,4,4,4,4)
v <- c(6,7,8,9,6,7,8,9,6,7,9,6,7,8,9)
r <- c(y,y,n,n,n,n,n,n,y,y,y,y,y,a,y)
df <- data.frame(d,v,r)
Не каждый избиратель голосует на каждых выборах. Что я хочу сделать, так это посмотреть, будут ли другие избиратели делать то же самое, что и конкретный избиратель (скажем, v == 8
). Обычно я бы просто использовал dplyr
:
df %>% group_by(d) %>% mutate(like8 = ifelse(r == r[v == 8], 1, 0))
Проблема, с которой я столкнулся, заключается в том, что этот конкретный избиратель v == 8
не имеет зарегистрированного голоса за каждое решение (что отличается от воздержавшихся голосов, которые записываются). Из-за этого я получаю следующую ошибку.
Ошибка в mutate_impl (.data, точки):
Столбец like8
должен иметь длину 3 (размер группы) или единицу, а не 0
То, что я сделал до сих пор, - это написал комбинацию ifelse и looping, чтобы обойти эту проблему.
with(df,
for (i in unique(d)) {
if(8 %in% v){
for (j in r[d == i]) {
df$like8[d == i & r == j] <- ifelse(j == r[v == 8], 1, 0)
}
} else {
for (j in r[d == i]){
df$like8[d == i & r == j] <- NA
}
}
}
)
- примечание: я никогда официально не инструктировался в «хороших» соглашениях по программированию, поэтому мое расположение скобок, вероятно, неясно и открыто для предложений.
Проблема, с которой я столкнулся, состоит в том, что мой фактический набор данных содержит более 500 000 наблюдений, и это очень медленно. Я видел здесь решений, использующих data.table
для случая, когда значение не пропущено, но я не понимаю data.table
достаточно, чтобы знать, как заставить это работать для моего случая.