Как создать флаг Y/N в наборе данных для общих переменных в рамках ИССЛЕДОВАНИЯ во фрейме данных

#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. Мне жаль, что это так грязно.