#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() явно, чтобы разъяснить это намерение читателям вашего кода.». Есть идеи, почему это не работает?