2016-04-13 23 views
2

veri çerçevesi sütunları mevcut İkisi arasında seçim Aşağıdaki veri kümesi vardır:Daha hızlı "EĞER" ifadesi geçici çözüm R

x <- 1000 
df <- data.frame(a = sample(c("Jack", "Jill"), x, replace = TRUE), 
       b = sample(c("Bonnie", "Clyde"), x, replace = TRUE), 
       c = sample(c("blue", "green"), x, replace = TRUE)) 

Ben Seçtikleri df$a alır yeni bir sütun denilen df $ seçim oluşturmak istediğinizde df$c == "blue" ve df$c == "green" olduğunda df$b seçer. 1000 sadece 2 üzerinde saniyedir - x < zaman

choice <- function(y) { 
    nw1 <- df[y, ] 

    if(nw1$c == "blue") { 
    nw1$choice = nw1$a 
    } else { 
    nw1$choice <- nw1$b 
    } 

    print(nw1) 
} 

rows <- c(1:nrow(df)) 
df2 <- do.call("rbind", lapply(rows, function(y) choice(y))) 

geçen zaman testi: bu durumda geleneksel if ve ifelse ifadelerle sınırlamaları anlama

, ben istenen görevi yerine aşağıdaki işlevi yarattı Ancak, x < - 25000 şişirildiğinde, geçen fonksiyon süresi makinemde 60 saniyenin üzerindedir.

Bu görevi hakkında gitmek için farklı bir yol önerisi var mı? Muhtemelen hile yapmak için farklı bir uygulama işlevi vardır, ama henüz çözmem gerekiyor.

+0

'ifelse' vektörleştirildi; Eğer değilse, eskiden çok daha fazlasını görürsünüz. – alistaire

+0

@rawr Yazma döngüleri yok, değil mi? Seviye sayısı ikiden fazla olduğunda daha anlamlı olan alternatifler vardır, ancak aksi takdirde 'ifelse' kısa ve hızlıdır. – alistaire

cevap

3

herhangi bir işlev için gerek yok veya/* apply döngüler, sadece karakter faktörleri ayarlayın ve biz çok hızlı olacağını basit row/column dizin kullanabilirsiniz

x <- 1000 
df <- data.frame(a = sample(c("Jack", "Jill"), x, replace = TRUE), 
       b = sample(c("Bonnie", "Clyde"), x, replace = TRUE), 
       c = sample(c("blue", "green"), x, replace = TRUE), stringsAsFactors = F) 


df$choice <- ifelse(df$c == "blue", df$a, df$b) 

head(df) 
    a  b  c choice 
1 Jack Bonnie blue Jack 
2 Jill Bonnie blue Jill 
3 Jack Clyde green Clyde 
4 Jack Bonnie green Bonnie 
5 Jill Bonnie green Bonnie 
6 Jill Bonnie blue Jill 
+0

Teşekkürler @Symbolix. Açıkçası, ifelse hakkındaki düşüncemde dizeleriAsFactors = F bölümü eksikti. – bshelt141

+0

@BrandonS - evet, bu yaygın bir 'gotcha'! – SymbolixAU

2

yeni sütununu atamak için ifelse kullanmak

df$choice <- df[cbind(1:nrow(df),(df$c!="blue")+1L)] 
head(df) 
#  a  b  c choice 
#1 Jill Bonnie green Bonnie 
#2 Jill Clyde green Clyde 
#3 Jill Clyde green Clyde 
#4 Jill Clyde blue Jill 
#5 Jack Clyde blue Jack 
#6 Jack Clyde green Clyde 
İlgili konular