2015-04-25 24 views
6

Bu dataframe var:Belirli dizeleri/karakterleri içeren belirli sütunlar nasıl seçilir?

df1 <- data.frame(a = c("correct", "wrong", "wrong", "correct"), 
    b = c(1, 2, 3, 4), 
    c = c("wrong", "wrong", "wrong", "wrong"), 
    d = c(2, 2, 3, 4)) 

a  b c  d 
correct 1 wrong 2 
wrong 2 wrong 2 
wrong 3 wrong 3 
correct 4 wrong 4 

ve sadece sütunları seçmek istiyorum ya dizeleri 'doğru' ya da ben bu dataframe olsun, öyle ki 'yanlış' (yani, sütunlar, b ve df1 içinde d) :

df2 <- data.frame(a = c("correct", "wrong", "wrong", "correct"), 
     c = c("wrong", "wrong", "wrong", "wrong")) 

     a  c 
1 correct wrong 
2 wrong wrong 
3 wrong wrong 
4 correct wrong 

bunu yapmak dplyr kullanabilir miyim? Değilse, bunu yapmak için hangi işlevleri kullanabilirim? Ben verdiğim örnek basittir, ki sadece bu (dplyr) yapabilirsiniz:

select(df1, a, c) 

Ancak, benim asıl dataframe içinde, ben yaklaşık 700 değişkenleri/sütunları ve dizeler içeren bir kaç yüz sütuna sahip 'Doğru' ya da 'yanlış' ve değişken/sütun isimlerini bilmiyorum.

Bunu nasıl yapılacağına dair herhangi bir öneri çabucak? Çok teşekkürler!

cevap

8

Sen df1 'in her bir kolon üzerinde işleyen ve mantıksal testi tatmin bütün olanları tutacak taban RFilter kullanabilirsiniz:

Filter(function(u) any(c('wrong','correct') %in% u), df1) 
#  a  c 
#1 correct wrong 
#2 wrong wrong 
#3 wrong wrong 
#4 correct wrong 

Ayrıca grepl kullanabilirsiniz:

Filter(function(u) any(grepl('wrong|correct',u)), df1) 
+0

Ben df1 [sapply (df1, function (x) herhangi bir (% c ("doğru", "yanlış"))))) '' yapmak için gidiyordum ama bu daha güzel. – A5C1D2H2I1M1N2O1R2T1

+0

Baz R'de Filtre olduğunu bilmiyordum! Çok teşekkürler! – hsl

2

---- + Teşekkürler Albay Beavel. Ne kadar zarif bir çözüm. Filter daha kullanacağım. Ben veri çerçevesini genişletti

locator <- apply(df1, 2, function(x) grepl("correct|wrong", x)) 
index <- apply(locator, 2, any) 
newdf <- df1[,!index] 

500.000 için sütunlar:
dftest <- as.data.frame(replicate(500000, df1[,1])) 

Sonra sistem zamanını test

Sadece vaka bir süre içinde çok hızlı bir çözüm denetlemek istediğiniz önemli bir faktördür % desen ile% apply, grepl ile Filter ve Filter bir fonksiyonu:

f <- function() { 
locator <- apply(dftest, 2, function(x) grepl("correct|wrong", x)) 
index <- apply(locator, 2, any) 
newdf <- dftest[,!index] 
} 

f1 <- function() {newdf <- (Filter(function(x) any(c("wrong", "correct") %in% x), dftest))} 

f2 <- function() {newdf <- Filter(function(u) any(grepl('wrong|correct',u)), dftest)} 


system.time(f()) 
    user system elapsed 
    24.32 0.00 24.35 
system.time(f1()) 
    user system elapsed 
    2.31 0.00 2.34 
system.time(f2()) 
    user system elapsed 
    8.66 0.01 8.71 

Albay'ın çözümü en iyisi. Temiz ve en iyisini yapar. - data.frame öneri için kredi @akrun.

+0

'dftest' bir matristir. 'Filtre' bir vektör çıkış verir, bu yüzden karşılaştırmanın doğru olduğundan emin değilim. 'Dftest'ı' data.frame''e dönüştürmeniz ve sonra karşılaştırmayı yapmanız gerekir. Eğer "dftest" i "data.frame" e çevirirsem, system.time sahip olduğum sistem.time (f()) # user sistemi geçen # 19.010 0.095 19.097; system.time (f1()) # kullanıcı sistemi doldu 2.290 0.004 2.292 ' – akrun

+0

Ayrıca 'matris' olarak 'dftest' ile denedim. system.time (f()) # kullanıcı sistemi aşıldı # 7.081 0.008 7.084 '. Yine de AlbayBeauvel'in işlevini yitirmedi. – akrun

+0

@akrun tekrar yaptın. Teşekkürler, güncellenirim. –

İlgili konular