R - добавление таблицы счетчиков в фрейм данных - PullRequest
0 голосов
/ 04 июля 2018

Я хотел бы получить таблицу подсчета из нескольких значений в моем фрейме данных, которые распределены по нескольким столбцам. В моем случае у некоторых из моих пациентов есть один или несколько типов лекарств. Теперь они упоминаются в нескольких столбцах. Вместо этого я хотел бы, чтобы каждое название лекарства было в отдельном столбце, и 1 или 0 (количество) на субъект, если оно есть или нет.

Например, мой фрейм данных теперь выглядит так:

Pp  X           X2              X3              X4 
1   NA          NA              NA              NA 
2   trimipramin NA              NA              NA
3   Quetiapin   venlafaxin      escitalopram    NA 
4   duloxetin   amitriptylin    NA              NA
5   quetiapin   citalopram      escitalopram    Lithium 
6   NA          NA              NA              NA
7   duloxetin   escitalopram    venlafaxin      NA

Я бы хотел, чтобы это выглядело так:

Pp  trimipramin escitalopram    quetiapin   venlafaxin  duloxetin   …
1   0           0               0           0           0           …
2   1           0               0           0           0           …
3   0           1               1           1           0           …
4   0           0               0           0           1           …   
5   0           1               1           0           0           …
6   0           0               0           0           0           …
7   0           1               0           1           1           …

Можно ли добавить такую ​​таблицу подсчета в мой фрейм данных, а не отдельно? Я предполагаю, что dplyr spread() может быть полезен в этом случае, но я не смог заставить его работать :-( Любая помощь?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Я не знаю, является ли это самым простым решением, но оно работает. Сначала вы должны получить все лекарства в векторе. Я делаю это с unlist и unqiue. Затем вы должны пройти через них и получить количество случаев. Я делаю это с помощью функции apply и суммы совпадений. Как вы хотите, в том же data.frame вы можете хранить его с data[[name]]. Это решение работает без каких-либо пакетов.

names = as.character(na.omit(unique(unlist(data))))
for(name in names){
  data[[name]] = apply(data, FUN = function(x) { sum(x == name, na.rm = T) }, 1)
}

Данные

data = read.table(text = "X           X2              X3              X4 
NA          NA              NA              NA 
trimipramin NA              NA              NA
Quetiapin   venlafaxin      escitalopram    NA 
duloxetin   amitriptylin    NA              NA
quetiapin   citalopram      escitalopram    Lithium 
NA          NA              NA              NA
duloxetin   escitalopram    venlafaxin      NA", header = T, stringsAsFactors = F)
0 голосов
/ 04 июля 2018

Функция table в base - это простой метод для создания этого типа матрицы двоичных индикаторов.

library(tidyverse)

D %>%
  gather(key, drug, -Pp) %>%
  select(-key) %>%
  table

#>Pp  amitriptylin citalopram duloxetin escitalopram Lithium ...
#> 1             0          0         0            0       0 ... 
#> 2             0          0         0            0       0 ... 
#> 3             0          0         0            1       0 ... 
#> 4             1          0         1            0       0 ... 
#> 5             0          1         0            1       1 ... 
#> 6             0          0         0            0       0 ... 
#> 7             0          0         1            1       0 ... 

Вы также можете сделать это, используя spread вместо этого, но это решение удалит пациентов без каких-либо сопутствующих лекарств:

D %>%
  gather(key, value, -Pp) %>%
  filter(!is.na(value)) %>% 
  mutate(key=1) %>%
  spread(value, key, fill=0, drop = FALSE)
0 голосов
/ 04 июля 2018
library(dplyr)
library(tidyr)
library(reshape2)

data %>% gather(key = "Med", value = "Value", -Pp) %>% select(-Med) %>% 
         dcast(Pp~Value,fun.aggregate = function(x){as.integer(length(x) > 0)})

Данные

data <- read.table(text="
        Pp  X           X2              X3              X4 
        1   NA          NA              NA              NA 
        2   trimipramin NA              NA              NA
        3   Quetiapin   venlafaxin      escitalopram    NA 
        4   duloxetin   amitriptylin    NA              NA
        5   quetiapin   citalopram      escitalopram    Lithium 
        6   NA          NA              NA              NA
        7   duloxetin   escitalopram    venlafaxin      NA",header=T, stringsAsFactors = F)
...