Самый быстрый способ проверить значение по строкам в одной группе?

#r

Вопрос:

Я пытаюсь найти способ проверить, совпадает ли значение переменной для каждого случая со значением другой переменной в группах и без usign для() циклов. Я был бы благодарен, если бы кто-нибудь мог мне помочь. Это упрощенная форма моих данных:

 library(data.table)

df<-data.table(personid<-c(101, 102, 103, 104, 105, 201, 202, 203, 301, 302, 401),
       hh_id<-c(1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4),
       fatherid<-c(NA, NA, 101, 101, 101, NA, NA, 201, NA, NA, NA),
 

(реальная-185000 строк, и fatherid-не единственная переменная, которую мне нужно проверить)

Что я пытаюсь сделать, так это создать переменную, которая проверяет, совпадает ли значение переменной personid данной строки со значением fatherid внутри членов одной и той же группы (группирующая переменная-hh_id). Для приведенных данных результат должен быть:

 df$result <- c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) 
 

но мне нужно что-то, чтобы делать это автоматически. Есть какие-нибудь идеи?

В случае, если вы хотите понять смысл моих вычислений, я пытаюсь построить сетки домашних хозяйств; это: является ли каждое наблюдение отцом по крайней мере другого наблюдения в том же домашнем хозяйстве (hh_id)

Заранее большое вам спасибо!

Комментарии:

1. Твой первый fatherid -НА. Каким может быть результат 1 ?

2. Вы можете использовать df[,by=hh_id, result:= personid==fatherid] .

3. @MartinGal, результат 1 в первом ряду, так как человек 101 является отцом некоторых других членов семьи (103 104 и 105). Я попробовал ваше решение, но затем я получаю ошибку: «Ошибка в [.data.table (df, , by = hh_id, := (результат, personid == fatherid)) : Предоставлено 11 элементов, которые должны быть отнесены к группе 1 размера 5 в столбце «результат». Длина RHS должна быть либо 1 (отдельные значения в порядке), либо точно соответствовать длине LHS. Если вы хотите» переработать » RHS, пожалуйста, используйте rep() явно, чтобы разъяснить это намерение читателям вашего кода.». Есть идеи, почему это не работает?

4. Представляют ли ваши примерные данные ваши фактические данные? Возникает ли ошибка в примере? Если нет, пожалуйста, обновите свой пример.

5. Да, это так. Ладно, это странно. Не знаю почему, но теперь все работало так, как я хотел… Большое вам спасибо за вашу помощь! Я не знаком с синтаксисом data.table. (Я обычно использую data.frame или dplyr) знаете ли вы, где я мог бы узнать больше о значении различных знаков препинания, которые появляются в вашем синтаксисе? Заранее спасибо

Ответ №1:

Похоже, вы ищете это:

 df[, result2 := personid %in% fatherid, by = hh_id]

#     personid hh_id fatherid result result2
#  1:      101     1       NA      1    TRUE
#  2:      102     1       NA      0   FALSE
#  3:      103     1      101      0   FALSE
#  4:      104     1      101      0   FALSE
#  5:      105     1      101      0   FALSE
#  6:      201     2       NA      1    TRUE
#  7:      202     2       NA      0   FALSE
#  8:      203     2      201      0   FALSE
#  9:      301     3       NA      0   FALSE
# 10:      302     3       NA      0   FALSE
# 11:      401     4       NA      0   FALSE
 

Где

 df <- data.table(
  personid = c(101, 102, 103, 104, 105, 201, 202, 203, 301, 302, 401),
  hh_id = c(1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4),
  fatherid = c(NA, NA, 101, 101, 101, NA, NA, 201, NA, NA, NA),
  result = c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
)
 

Комментарии:

1. Я попробовал ваше решение, но затем я получаю ошибку: «Ошибка в [.data.table(df, , by = hh_id, :=(результат, personid == fatherid)) : Предоставлено 11 элементов, которые должны быть отнесены к группе 1 размера 5 в столбце «результат». Длина RHS должна быть либо 1 (отдельные значения в порядке), либо точно соответствовать длине LHS. Если вы хотите» переработать » RHS, пожалуйста, используйте rep() явно, чтобы разъяснить это намерение читателям вашего кода.». Есть идеи, почему это не работает?