2017-02-09 55 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. 還有約300萬行和身體部位,並測試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

這裏的一個方式儘管我不確定我有多普遍t會。

首先獲取「位置」列的列引用,並使用它提取「位置」值(「骨骼」,「布萊恩」等)。

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

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

然後從主數據框中分離出位置列,並使用它來創建新列。我們使用collapsepaste功能,堅持各種匹配單詞連在一起:

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