Как объединить записи строк для одного и того же ID пациента в R при сохранении других столбцов и значений NA? - PullRequest
0 голосов
/ 18 сентября 2018

Мне нужно объединить некоторые столбцы для этих нескольких идентификаторов и просто использовать значения из первого списка идентификаторов для других. Например, здесь я просто хочу объединить столбец «расходы» и столбец сердечного приступа, чтобы просто сказать, был ли у них сердечный приступ. Затем я хочу удалить повторяющиеся идентификаторы # и просто сохранить значения из первого списка для других столбцов:

df <- read.table(text = 
              "ID  Age   Gender  heartattack    spending 
               1 24 f 0 140
               2 24 m na 123
               2 24 m 1 58
               2 24 m 0 na
               3 85 f 1 170
               4 45 m na 204", header=TRUE)

Что мне нужно:

df2 <- read.table(text = 
            "ID  Age   Gender  ever_heartattack all_spending 
             1 24 f 0 140
             2 24 m 1 181
             3 85 f 1 170
             4 45 m na 204", header=TRUE)

Я пробовал group_by с помощью transmute () и sum () следующим образом:

df$heartattack = as.numeric(as.character(df$heartattack))
df$spending  = as.numeric(as.character(df$spending))

library(dplyr)
df = df %>% group_by(ID) %>% transmute(ever_heartattack = sum(heartattack, na.rm = T), all_spending = sum(spending, na.rm=T))

Но это удаляет все остальные столбцы! Кроме того, он превращает значения NA в нули ... например, я все еще хочу, чтобы значение "NA" было значением для идентификатора пациента # 4, я не хочу изменять данные, чтобы сказать, что у них никогда не было сердечного приступа!

> print(dfa) #This doesn't at all match df2 :(
  ID ever_heartattack all_spending
1  1                0          140
2  2                1          181
3  2                1          181
4  2                1          181
5  3                1          170
6  4                0          204

1 Ответ

0 голосов
/ 18 сентября 2018

Не могли бы вы сделать это?

aggregate(
    spending ~ ID + Age + Gender, 
    data = transform(df, spending = as.numeric(as.character(spending))),
    FUN = sum)
#  ID Age Gender spending
#1  1  24      f      140
#2  3  85      f      170
#3  2  24      m      181
#4  4  45      m      204

Некоторые комментарии:

  1. Дело в том, что при агрегировании вы не даете четких правил, как обращаться с даннымив дополнительных столбцах, которые отличаются (например, heartattack в этом случае).Например, для ID = 2 почему вы сохраняете heartattack = 1 вместо heartattack = na или heartattack = 0?

  2. Ваши "na" фактически не являются NA s,Это приводит к тому, что spending является столбцом factor вместо вектора numeric.


Чтобы точно воспроизвести ожидаемый результат, который можно сделать

df %>%
    mutate(
        heartattack = as.numeric(as.character(heartattack)),
        spending = as.numeric(as.character(spending))) %>%
    group_by(ID, Age, Gender) %>%
    summarise(
        heartattack = ifelse(
            any(heartattack %in% c(0, 1)),
            max(heartattack, na.rm = T),
            NA),
        spending = sum(spending, na.rm = T))
## A tibble: 4 x 5
## Groups:   ID, Age [?]
#     ID   Age Gender heartattack spending
#  <int> <int> <fct>        <dbl>    <dbl>
#1     1    24 f                0      140
#2     2    24 m                1      181
#3     3    85 f                1      170
#4     4    45 m               NA      204

Это кажется немного "хакерским" из-заправила не ясны, какое heartattack значение оставить.В этом случае мы

  • сохраняем максимальное значение heartattack, если heartattack содержит либо 0, либо 1.
  • возвращаем NA, если heartattack не содержит 0 или1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...