2013-02-28 12 views
5

Ciao Sto facendo una cosa molto semplice qui.Calcola il rapporto tra le colonne in base alle condizioni in R

Ho 3 colonne di dati; a, b e c. Voglio calcolare il rapporto tra B e C, quando il valore di b è solo maggiore di 5.

Il codice che ho usato è il seguente:

a <- c(1,2,3,4,5,6,7,8) 
b <- c(2,4,5,8,10,12,15,18) 
c <- c (10,9,8,15,31,12,13,12) 

df <- data.frame(a,b,c) 
## Calculate the ratio 
df$d <- with(df,b/c) 

ho calcolato il rapporto, ma non sono riuscito a utilizzare il condizione lì. So che è banale, ma ci vuole molto tempo. Apprezzo il vostro aiuto.

+2

+1 per esempio riproducibile. –

risposta

5

È possibile utilizzare ifelse. Tu non dici quello che vuoi che il risultato sia nei casi in cui B è inferiore a 5, così ho assunto che si desidera NA ci .:

> df$d <- with(df, ifelse(b > 5, b/c, NA)) 
> df 
    a b c   d 
1 1 2 10  NA 
2 2 4 9  NA 
3 3 5 8  NA 
4 4 8 15 0.5333333 
5 5 10 31 0.3225806 
6 6 12 12 1.0000000 
7 7 15 13 1.1538462 
8 8 18 12 1.5000000 
+0

+1, ifelse è la soluzione più elegante. –

+0

Grazie mille. Sto anche cercando di usare la condizione if else ma non riesco a capirlo. Segnalo come una risposta. –

3

È possibile sottoinsieme valori per df$d e all'interno della funzione with() .

df$d[df$b>5] <- with(df[df$b>5,],b/c) 
df 
    a b c   d 
1 1 2 10  NA 
2 2 4 9  NA 
3 3 5 8  NA 
4 4 8 15 0.5333333 
5 5 10 31 0.3225806 
6 6 12 12 1.0000000 
7 7 15 13 1.1538462 
8 8 18 12 1.5000000 
+0

Grazie mille per la risposta. –

1

avevo prima calcolare il rapporto, e quindi assegnare NA ai valori in cui b < 5:

df = within(df, { d = b/c }) 
df$d[df$b <= 5] <- NA 

> df 
    a b c   d 
1 1 2 10  NA 
2 2 4 9  NA 
3 3 5 8  NA 
4 4 8 15 0.5333333 
5 5 10 31 0.3225806 
6 6 12 12 1.0000000 
7 7 15 13 1.1538462 
8 8 18 12 1.5000000 
+0

Grazie per aver risposto alla mia domanda. Sapevo 3 modi per fare una cosa. –

+0

@Jdbaba sai 4 ora :) – agstudy

+2

Altro == migliore;) –

4

Penso che transform è più elegante qui :) (leggermente diverso di soluzione @Ananda)

transform(df, d= ifelse(b > 5, b/c, NA)) 
    a b c   d 
1 1 2 10  NA 
2 2 4 9  NA 
3 3 5 8  NA 
4 4 8 15 0.5333333 
5 5 10 31 0.3225806 
6 6 12 12 1.0000000 
7 7 15 13 1.1538462 
8 8 18 12 1.5000000 
+0

+1 per un'altra alternativa, e solo per divertimento, se hai un momento, per favore commenta [su questo] (http://news.mrdwab.com/2012/12/04/what-esattamente-è-elegante-codice-a-r /). – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Certo che lo farò. – agstudy

Problemi correlati