2012-10-25 13 views
11

Ho frame di dati in questo modo:Trovare l'indice della colonna nella struttura di dati che contiene la stringa come valore di

df <- data.frame(col1 = c(letters[1:4],"a"),col2 = 1:5,col3 = letters[10:14]) 
df 
    col1 col2 col3 
1 a 1 j 
2 b 2 k 
3 c 3 l 
4 d 4 m 
5 a 5 n 

voglio trovare l'indice della colonna di df che ha valori corrispondenti alla stringa " un". che dovrebbe darmi 1 come risultato. Ho provato a usare in modo sbrigativo ma non funziona. Qualcuno sa come farlo senza un ciclo ??

risposta

13

Qualcosa di simile?

which(apply(df, 2, function(x) any(grepl("a", x)))) 

I passi sono:

  1. Con apply andare oltre ogni colonna
  2. Cerca se a è in questa colonna con grepl
  3. Dal otteniamo un vettore di nuovo, utilizzare any per ottenere TRUE se qualche elemento è stato abbinato a a
  4. Infine controllare which elementi (colonne) sono TRUE (ad es. contenere la lettera ricercata a).
+0

Grazie mille @jmsigner. – user1021713

3

Dal momento che si parla che stavi cercando di utilizzare sapply(), ma non hanno avuto successo, ecco come si può fare:

> sapply(df, function(x) any(x == "a")) 
col1 col2 col3 
TRUE FALSE FALSE 
> which(sapply(df, function(x) any(x == "a"))) 
col1 
    1 

Naturalmente, è anche possibile utilizzare l'approccio grep()/grepl() se si preferisce string matching . Puoi anche includere la tua funzione which() con unname() se desideri solo il numero di colonna.

+0

Grazie mille per questa soluzione anche ... – user1021713

Problemi correlati