#r #data.table
Вопрос:
Я хочу создать флаг ДА/НЕТ в наборе данных таким образом, чтобы, если переменная в VARIABLE
столбце присутствует в каждом STUDY
, то ДА, в противном случае НЕТ. так, например, когда ВОЗРАСТ присутствует во всех исследованиях, флаг должен быть «ДА», иначе это «нет».
Простой пример здесь, но мои данные намного больше и содержат также другие столбцы:
STUDY VARIABLE
STUDY1 AGE
STUDY1 SEX
STUDY1 WT
STUDY2 AGE
STUDY2 RACE
STUDY2 WT
STUDY3 AGE
STUDY3 SEX
STUDY3 WT
Результат должен быть:
STUDY VARIABLE FLAG
STUDY1 AGE YES
STUDY1 SEX NO
STUDY1 WT YES
STUDY2 AGE YES
STUDY2 RACE NO
STUDY2 WT YES
STUDY3 AGE YES
STUDY3 SEX NO
STUDY3 WT YES
Как я могу сделать это в R, используя «data.table» ?
Комментарии:
1. Можете ли вы объяснить логику, которую нужно реализовать здесь? Когда у вас есть «ДА», а когда «НЕТ»? Я не понимаю, что вы имеете в виду
if a variable in VARIABLE column is present
.2. Я отредактировал вопрос и дал дополнительные пояснения
3. Может ли переменная существовать только один раз в a
STUDY
? ТакAGE
произойдет ли это максимум 1 раз и не повторится ли в исследовании ?4. Да, возможно, что переменная будет существовать в одном исследовании, но не в других исследованиях.
5. и да, переменная существует только один раз в каждом исследовании
Ответ №1:
Вы можете проверить наличие уникальных подсчетов STUDY
в каждом VARIABLE
из них .
library(data.table)
setDT(df) #If needed to convert to `data.table`
df[, FLAG := ifelse(uniqueN(STUDY) == uniqueN(df$STUDY), 'YES', 'NO'), VARIABLE]
df
# STUDY VARIABLE FLAG
#1: STUDY1 AGE YES
#2: STUDY1 SEX NO
#3: STUDY1 WT YES
#4: STUDY2 AGE YES
#5: STUDY2 RACE NO
#6: STUDY2 WT YES
#7: STUDY3 AGE YES
#8: STUDY3 SEX NO
#9: STUDY3 WT YES
Ответ №2:
Вы можете попробовать
df[, n := (.N == 3), by = VARIABLE][, FLAG := c("YES", "NO")[match(FLAG, c(TRUE, FALSE))]]
STUDY VARIABLE FLAG
1: STUDY1 AGE YES
2: STUDY1 SEX NO
3: STUDY1 WT YES
4: STUDY2 AGE YES
5: STUDY2 RACE NO
6: STUDY2 WT YES
7: STUDY3 AGE YES
8: STUDY3 SEX NO
9: STUDY3 WT YES
Если вам нужен обобщенный способ, пожалуйста, дайте мне знать(с конкретным условием буду благодарен).
df[, FLAG := (.N == df[,uniqueN(n = uniqueN(STUDY), STUDY)]), by = VARIABLE][, FLAG := c("YES", "NO")[match(FLAG, c(TRUE, FALSE))]]
Комментарии:
1. Условие состоит в том, что, например, когда ВОЗРАСТ присутствует во всех исследованиях, флаг должен быть «ДА», иначе это «НЕТ». То же самое для всех остальных.
2. @Amer Я добавляю новый код выше. Это более общее, чем использование 3. Мне жаль, что это так грязно.