2017-02-09 22 views
1

Я работаю с данными о здравоохранении, которые имеют разные части тела и радиологические тесты в качестве столбцов. Ниже приведен снимок кадра данных -Преобразование имен столбцов в значения строк на основе условных флагов

loc_brain loc_bone loc_pelvis mod_ct mod_xray 
    0   1   1   0  1 
    1   1   0   1  0 
    0   0   1   1  1 
  1. Все столбцы, начиная с «LOC» флаг части тела. Точно так же столбцы, начиная с «мод» помечать радиологические испытания

  2. Идея заключается в том, чтобы создать две новые колонки под названием расположение и модальности, которые должны следовать ниже шаблон

    loc_brain loc_bone loc_pelvis mod_ct mod_xray location   modality 
        0   1   1   0  1  bone pelvis   xray 
        1   1   1   1  1  brain bone pelvis ct xray 
        0   0   1   1  1  pelvis    ct xray 
    

выход Если «LOC «столбцы помечены 1, то новый столбец местоположения будет иметь имя частей тела. То же самое относится к столбцам «mod».

Способ, которым я подходил к этой проблеме, заключался в использовании dplyr и рассмотрении каждой комбинации флагов и заполнении значений местоположения и модальности.

input_df$location<-"" 
input_df$modality<-"" 
input_df <- input_df %>% 
      mutate(location= replace(location,(loc_bone==1 & loc_pelvis==1),"bone pelvis")) %>% 
      mutate(modality= replace(modality,mod_xray==1, "xray")) 
  1. Есть около миллиона строк и 65 столбцов частей тела и испытаний.
  2. Поиск всей комбинации и мутации каждой комбинации является беспорядочным. Есть ли способ автоматизировать этот подход, используя dplyr или base R?

Ниже приведен воспроизводимым пример кадра входных данных -

loc_brain<-c(0,1,0) 
loc_bone<-c(1,1,0) 
loc_pelvis<-c(1,0,1) 
mod_ct<-c(0,1,1) 
mod_xray<-c(1,0,1) 
input_df<-as.data.frame(cbind(loc_brain,loc_bone,loc_pelvis,mod_ct,mod_xray)) 

ответ

2

Возможное решение с data.table:

library(data.table) 
setDT(input_df)[, loc := paste0(gsub('loc_','',names(.SD)[.SD==1]), collapse = ' '), 1:nrow(input_df), .SDcols = 1:3 
       ][, mod := paste0(gsub('mod_','',names(.SD)[.SD==1]), collapse = ' '), 1:nrow(input_df), .SDcols = 4:5][] 

который дает:

loc_brain loc_bone loc_pelvis mod_ct mod_xray   loc  mod 
1:   0  1   1  0  1 bone pelvis xray 
2:   1  1   0  1  0 brain bone  ct 
3:   0  0   1  1  1  pelvis ct xray 
+0

это работает но для обработки данных требуется некоторое время. – x1carbon

0

Вот способ это работает, хотя я не уверен, как обобщаемый i t будет.

Сначала получите ссылки столбцов столбцов «местоположение» и используйте их для извлечения только значений «местоположение» («кость», «бриан» и т. Д.).

location.columns <- grep("^loc_", names(df)) 

location.values <- names(df)[ location.columns ] 
location.values <- sub("^loc_", "", location.values) 

Затем выделите столбцы местоположения из основного блока данных и используйте его для создания нового столбца. Мы используем collapse в функции paste придерживаться различных подходящих слов вместе:

locations.df <- df[ , location.columns ] 
df$location <- sapply(seq_len(nrow(df)), 
         function(x) { 
          paste(location.values[ locations.df[x,] == 1 ], collapse = " ") 
         } 
) 

Повторите эти действия для "мода" значений:

mod.columns <- grep("^mod_", names(df)) 

mod.values <- names(df)[ mod.columns ] 
mod.values <- sub("^mod_", "", mod.values) 

mods.df <- df[ , mod.columns ] 
df$mod <- sapply(seq_len(nrow(df)), 
         function(x) { 
          paste(mod.values[ mods.df[x,] == 1 ], collapse = " ") 
         } 
) 

Что дает:

> df 
    loc_brain loc_bone loc_pelvis mod_ct mod_xray location  mod 
1   0  1   1  0  1 bone pelvis xray 
2   1  1   0  1  0 brain bone  ct 
3   0  0   1  1  1  pelvis ct xray