2016-06-20 2 views
4

У меня есть кадр данных, который выглядит примерно так:«Правильный» способ сделать ряды замена

dataDemo <- data.frame(POS = 1:4 , REF = c("A" , "T" , "G" , "C") , 
    ind1 = c("A" , "." , "G" , "C") , ind2 = c("A" , "C" , "C" , "."), 
                stringsAsFactors=FALSE) 

dataDemo 

    POS REF ind1 ind2 
1 1 A A A 
2 2 T . C 
3 3 G G C 
4 4 C C . 

и я хотел бы заменить все s со значением REF для этой строки «» , Вот как я это сделал:

for(i in seq_along(dataDemo$REF)){ 
    dataDemo[i , ][dataDemo[i , ] == '.'] <- dataDemo$REF[i] 
} 

Я хотел бы знать, если есть более «правильный» или идиоматический способ сделать это в R. Я вообще стараюсь использовать * применять всякий раз, когда это возможно, и это похоже на то, которые могут быть легко адаптированы к такому подходу и сделаны более читабельными (и работают быстрее), но, несмотря на то, что они бросают ему немного времени, я не добился большого прогресса.

ответ

7

Вот еще base R альтернатива, где мы используем номера строк из "." вхождений заменить их соответствующими REF значений.

# Get row numbers 
rownrs <- which(dataDemo==".", arr.ind = TRUE)[,1] 

# Replace values 
dataDemo[dataDemo=="."] <- dataDemo$REF[rownrs] 

# Result 
dataDemo 
# POS REF ind1 ind2 
#1 1 A A A 
#2 2 T T C 
#3 3 G G C 
#4 4 C C C 
+0

Совершенно просто. Это то, что происходит, когда я иду и пытаюсь научиться C. – mnosefish

4

Здесь можно использовать set от data.table, который должен быть быстрым.

library(data.table) 
setDT(dataDemo) 
nm1 <- paste0("ind", 1:2) 
for(j in nm1){ 
    i1 <- dataDemo[[j]]=="." 
    set(dataDemo, i = which(i1), j=j, value = dataDemo$REF[i1]) 
} 

dataDemo 
# POS REF ind1 ind2 
#1: 1 A A A 
#2: 2 T T C 
#3: 3 G G C 
#4: 4 C C C 

EDIT: На основе @ alexis_laz Замечаниями


Или с помощью dplyr

library(dplyr) 
dataDemo %>% 
    mutate_each(funs(ifelse(.==".", REF,.)), ind1:ind2) 
# POS REF ind1 ind2 
#1 1 A A A 
#2 2 T T C 
#3 3 G G C 
#4 4 C C C 

Или мы можем использовать base R методы, чтобы сделать это в одной строке.

dataDemo[nm1] <- lapply(dataDemo[nm1], function(x) ifelse(x==".", dataDemo$REF, x)) 
+1

Сохранение, в каждой итерации, An 'я = dataDemo [[J]] == ""', чтобы избежать вычисления дважды, должен сделать его еще более эффективный. –

8

В dplyr,

library(dplyr) 

dataDemo %>% mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) 
# POS REF ind1 ind2 
# 1 1 A A A 
# 2 2 T T C 
# 3 3 G G C 
# 4 4 C C C 
+0

Мне нужно потратить некоторое время на то, чтобы лучше использовать plyr и dplyr. – mnosefish

+0

'plyr' несколько заменяется на' dplyr', поэтому вам, вероятно, нужно только изучить последнее. Вероятно, это тоже не займет слишком много времени; это довольно просто. – alistaire

+0

@akrun Довольно много, но оно было первоначально опубликовано, прежде чем вы добавили 'dplyr' в редактирование. Также у вас будут проблемы, если 'stringsAsFactors = TRUE'. – alistaire

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