R - is.element внутри sapply для столбца со значениями, разделенными запятыми - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть фрейм данных со столбцом с именем Disease и списком Disease_List (уникальные значения столбца Disease), как этот

Disease
--------------------------
Diabetes, Blood Pressure
Diabetes
Anemia
No
Blood Pressure,Anemia

Я попытался использовать функцию sapply, как показано ниже:

xx<-sapply(my_data$Disease, function(x) is.element(toString(stri_split_fixed(x,","))[[1]],unlist(Disease_List))[[1]]  + 0)

выход

> xx
  0 1 1 0 0

Он рассматривает значения, разделенные запятыми, как новое значение, которого нет в списке и которое возвращает 0.

Мне нужен вывод, как этот

Diabetes    Blood Pressure    Anemia    
1            1                 0
1            0                 0
0            0                 1
0            0                 0
0            1                 1

Ответы [ 4 ]

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

Мы можем использовать mtabulate

library(qdapTools)
cbind(df, mtabulate(strsplit(df$Disease, ",\\s*")))
#                    Disease Anemia Blood Pressure Diabetes No
#1 Diabetes, Blood Pressure      0              1        1  0
#2                 Diabetes      0              0        1  0
#3                   Anemia      1              0        0  0
#4                       No      0              0        0  1
#5    Blood Pressure,Anemia      1              1        0  0

данные

df <- structure(list(Disease = c("Diabetes, Blood Pressure", "Diabetes", 
 "Anemia", "No", "Blood Pressure,Anemia")), row.names = c(NA, 
 -5L), class = "data.frame")
0 голосов
/ 14 сентября 2018

Метод из splitstackshape

library(splitstackshape)

cSplit_e(df, "Disease", sep = ",",mode = "binary", type = "character", fill = 0, drop = F)
                   Disease Disease_Anemia Disease_Blood Pressure Disease_Diabetes Disease_No
1 Diabetes, Blood Pressure              0                      1                1          0
2                 Diabetes              0                      0                1          0
3                   Anemia              1                      0                0          0
4                       No              0                      0                0          1
5    Blood Pressure,Anemia              1                      1                0          0
0 голосов
/ 14 сентября 2018

A tidyverse опция с использованием tidyr::separate_rows

library(tidyverse)
df %>%
    rowid_to_column("row") %>%
    separate_rows(Disease, sep = ",\\s*") %>%
    mutate(n = 1) %>%
    spread(Disease, n, fill = 0) %>%
    select(-row)
#  Anemia Blood Pressure Diabetes No
#1      0              1        1  0
#2      0              0        1  0
#3      1              0        0  0
#4      0              0        0  1
#5      1              1        0  0

Пример данных

df <- read.table(text =
    "Disease
'Diabetes, Blood Pressure'
Diabetes
Anemia
No
'Blood Pressure,Anemia'", header = T)
0 голосов
/ 14 сентября 2018
 cbind(my_data,+Vectorize(grepl)(disease_list,my_data['Disease']))
                   Disease Diabetes Blood Pressure Anemia No
1 Diabetes, Blood Pressure        1              1      0  0
2                 Diabetes        1              0      0  0
3                   Anemia        0              0      1  0
4                       No        0              0      0  1
5    Blood Pressure,Anemia        0              1      1  0

Вы также можете использовать +sapply(disease_list,grepl,my_data$Disease)

, где

my_data = read.table(col.names = 'Disease',
                     stringsAsFactors = FALSE,
                     strip.white = TRUE
                     sep = '|',
                     text = ' Diabetes, Blood Pressure
                                            Diabetes
                                               Anemia
                                                   No
                                Blood Pressure,Anemia')
 disease_list = unique(trimws(unlist(strsplit(as.character(my_data$Disease),','))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...