2015-03-11 4 views
3

У меня есть кадр данных, как показано нижеКак удалить строку на основе элементарной ситуации?

V1  V2  V3  V4  V5 
ATP1A2 ATP1A1 220948_s_at LARS2 204016_at 
CAPRIN1 ATP1A2    LARS2 
ATP1A1 ATP1A2 203296_s_at MTHFD1 202309_at 
CBX3 ATP1B1 201243_s_at PRKCSH 200707_at 
AUP1 ATP1B1    PRKCSH 214080_x_at 
LARS2 AUP1 220525_s_at PRKCSH 
MTHFD1 AUP1    VDAC2 211662_s_at 
VDAC2 B3GNT3 204856_at VDAC2 
PRKCSH B3GNT3   
ATP1B1 CAPRIN1 200722_s_at  
B3GNT3 CAPRIN1 200723_s_at  
     CAPRIN1   
     CBX3 200037_s_at 

Я хочу, чтобы удалить эти элементы из V2, что V3 является пустым или из V4, что V5 является пустым, например, в V3, второй элемент пуст, так как второй элемент V3 и V2 следует удалить. как будет выглядеть результат, будет показано ниже.

 V1  V2  V3   V4  V5 
    ATP1A2 ATP1A1 220948_s_at LARS2 204016_at 
    CAPRIN1 ATP1A2 203296_s_at MTHFD1 202309_at     
    ATP1A1 ATP1B1 201243_s_at PRKCSH 200707_at 
    CBX3 AUP1  220525_s_at PRKCSH 214080_x_at 
    AUP1 B3GNT3 204856_at  VDAC2 211662_s_at 
    LARS2 CAPRIN1 200722_s_at 
    MTHFD1 CAPRIN1 200723_s_at 
    VDAC2 CBX3  200037_s_at 
    PRKCSH   
    ATP1B1  
    B3GNT3  

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

# to find the empty elements 
Rcolumn3 <-which(df$V3=="") 
Rcolumn5 <-which(df$V5=="") 

df<- structure(list(V1 = structure(c(3L, 7L, 2L, 8L, 5L, 9L, 10L, 
12L, 11L, 4L, 6L, 1L, 1L), .Label = c("", "ATP1A1", "ATP1A2", 
"ATP1B1", "AUP1", "B3GNT3", "CAPRIN1", "CBX3", "LARS2", "MTHFD1", 
"PRKCSH", "VDAC2"), class = "factor"), V2 = structure(c(1L, 2L, 
2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 6L, 7L), .Label = c("ATP1A1", 
"ATP1A2", "ATP1B1", "AUP1", "B3GNT3", "CAPRIN1", "CBX3"), class = "factor"), 
    V3 = structure(c(9L, 1L, 6L, 5L, 1L, 8L, 1L, 7L, 1L, 3L, 
    4L, 1L, 2L), .Label = c("", "200037_s_at", "200722_s_at", 
    "200723_s_at", "201243_s_at", "203296_s_at", "204856_at", 
    "220525_s_at", "220948_s_at"), class = "factor"), V4 = structure(c(2L, 
    2L, 3L, 4L, 4L, 4L, 5L, 5L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "LARS2", "MTHFD1", "PRKCSH", "VDAC2"), class = "factor"), 
    V5 = structure(c(4L, 1L, 3L, 2L, 6L, 1L, 5L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = c("", "200707_at", "202309_at", "204016_at", 
    "211662_s_at", "214080_x_at"), class = "factor")), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-13L)) 

вы можете получить данные по

+2

Вы можете попробовать 'DF [, 2: 3] <- rbind (DF [-Rcolumn3,2: 3], data.frame (V2 = Rep ('', длина (Rcolumn3)), V3 = rep ('', length (Rcolumn3))); df [, 4: 5] <- rbind (df [-Rcolumn5,4: 5], data.frame (V4 = rep ('', length (Rcolumn5)), V5 = rep ('', length (Rcolumn5)))); df [rowSums (df! = '')! = 0,] ' – akrun

+0

@akrun спасибо, но если у меня есть 1000 столбцов, которые затем я хочу сделать это в качестве альтернативы , это не удобство для этого, не так ли? –

ответ

3

Это способ:

#convert to character 
df[] <- lapply(df, as.character) 

#convert the equivalent V2 or V4 columns' rows into '' 
a <- which(df$V3=='') 
b <- which(df$V5=='') 

df$V2[a] <- '' 
df$V4[b] <- '' 

в этот момент я ве написал функцию, которая толкает заготовки к конечному/нижней части вектора/колонки:

push_up <- function(vec){ 
    c(vec[-which(vec=='')], vec[which(vec=='')]) 
} 

и применить, что к ДФ:

df[] <- lapply(df, push_up) 

Выходные:

> df 
     V1  V2   V3  V4   V5 
1 ATP1A2 ATP1A1 220948_s_at LARS2 204016_at 
2 CAPRIN1 ATP1A2 203296_s_at MTHFD1 202309_at 
3 ATP1A1 ATP1B1 201243_s_at PRKCSH 200707_at 
4  CBX3 AUP1 220525_s_at PRKCSH 214080_x_at 
5  AUP1 B3GNT3 204856_at VDAC2 211662_s_at 
6 LARS2 CAPRIN1 200722_s_at     
7 MTHFD1 CAPRIN1 200723_s_at     
8 VDAC2 CBX3 200037_s_at     
9 PRKCSH          
10 ATP1B1          
11 B3GNT3          
12            
13     

Или df[df$V1 != '',] для удаления рядов 12 , 13

2

Мы могли бы попробовать set от data.table, так как есть ma ny столбцов (созданных «df1» с еще несколькими столбцами). Основной подход аналогичен элементу @ Lyzander, т. Е. Изменению элементов, которые не являются '' в чередующихся столбцах, до '' на основе значений '' в другом столбце, а затем «нажимаем» '' элементов в конце каждого столбца. (Предполагается, что модификация начинается для чередующихся столбцов из второго столбца).

library(data.table) 
df1 <- cbind(df, setNames(df[-1], paste0('V',6:9))) 

Изменен класс колонки от factor до character, как это будет проще для изменения значения.

df1[] <- lapply(df1, as.character)  

Преобразование 'data.frame' в 'data.table'

setDT(df1) 

Создать числовой индекс для переменного столбца

j1 <- as.integer(seq(3, ncol(df1), by=2)) 

Использование set для замены элементов в столбец «j-1-й», основанный на наличии '' в столбце «jth», order столбцов «jth» и «j-1» на основании наличия '' (2nd an d 3 set линий).Я не уверен, если это является наиболее эффективным, хотя (с учетом трех линий set), но set в целом очень эффективно, как накладные расходы [.data.table избежать

for(j in j1){ 
    set(df1, i=which(df1[[j]]==''), j=j-1L, value='') 
    set(df1, i=NULL, j=j, value= df1[[j]][order(df1[[j]]=='')]) 
    set(df1, i=NULL, j=j-1L, value= df1[[j-1L]][order(df1[[j-1L]]=='')]) 
} 

Удалите '' элементы в конце V1 колонны чтобы получить ожидаемый результат.

df1[V1!=''] 
#  V1  V2   V3  V4   V5  V6   V7  V8 
#1: ATP1A2 ATP1A1 220948_s_at LARS2 204016_at ATP1A1 220948_s_at LARS2 
#2: CAPRIN1 ATP1A2 203296_s_at MTHFD1 202309_at ATP1A2 203296_s_at MTHFD1 
#3: ATP1A1 ATP1B1 201243_s_at PRKCSH 200707_at ATP1B1 201243_s_at PRKCSH 
#4: CBX3 AUP1 220525_s_at PRKCSH 214080_x_at AUP1 220525_s_at PRKCSH 
#5: AUP1 B3GNT3 204856_at VDAC2 211662_s_at B3GNT3 204856_at VDAC2 
#6: LARS2 CAPRIN1 200722_s_at     CAPRIN1 200722_s_at  
#7: MTHFD1 CAPRIN1 200723_s_at     CAPRIN1 200723_s_at  
#8: VDAC2 CBX3 200037_s_at      CBX3 200037_s_at  
#9: PRKCSH                 
#10: ATP1B1                 
#11: B3GNT3                 
#   V9 
#1: 204016_at 
#2: 202309_at 
#3: 200707_at 
#4: 214080_x_at 
#5: 211662_s_at 
#6:    
#7:    
#8:    
#9:    
#10:    
#11:    
+0

как всегда мне понравилось ваше решение благодаря –

+0

@Nemo Спасибо за ваши щедрые комментарии. – akrun

Смежные вопросы