Un modo elegante per contare il numero di elementi negativi in un vettore?

Ho un vettore di dati con una risoluzione di 1024 valori e la necessità di contare il numero di negativo non valide. C’è un modo elegante per fare questo senza un loop e verifica se un elemento è <0 e l’incremento di un contatore?

OriginaleL’autore Carey | 2011-04-12

3 Replies
  1. 32

    Che si desidera leggere ‘Un’Introduzione ad R’. La tua risposta qui è semplicemente

     sum(  x < 0  )

    che funziona grazie a vectorisation. Il x < 0 espressione restituisce un vettore di booleani oltre che sum() in grado di operare (convertendo i valori booleani standard 0/1 valori).

    Il vettore non è convertito in valore numerico (per le versioni successive di R in ogni caso) – lavori di somma logica direttamente. Questo può essere facilmente osservati. x <- rep(c(T,F), 2^30-1) causa mia R sessione RSS per aumentare il per ~8G. sum(x) non aumenta questo. Tuttavia, sum(as.numeric(x)) cause RSS per aumentare il per ~25G (e, naturalmente, restituisce lo stesso valore).
    Se il set di dati è NA valori dovrebbe essere il comando sum(x < 0, na.rm = TRUE). In caso contrario, restituisce come risultato di NA

    OriginaleL’autore Dirk Eddelbuettel

  2. 0

    C’è una buona risposta a questa domanda da parte di Steve Lianoglou Come identificare le righe nel mio dataframe con un valore negativo, in ogni colonna?

    Permettetemi di replicare il suo codice con una piccola aggiunta (4 ° punto).

    1. Immaginare che si erano dati.telaio come questo:

      df <- data.frame(a = 1:10, b = c(1:3,-4, 5:10), c = c(-1, 2:10))
    2. Questo vi restituisca un vettore booleano di cui righe sono i valori negativi:

      has.neg <- apply(df, 1, function(row) any(row < 0))
    3. Qui sono gli indici per i numeri negativi:

      which(has.neg)
    4. Qui è un conteggio di elementi con numeri negativi:

      length(which(has.neg))
    L’OP è un vettore, quindi, qualcosa di simile lunghezza(x[x < 0]).

    OriginaleL’autore andrii

  3. 0

    Le soluzioni di cui sopra prescritti devono essere modificati in ordine per applicare questo per un df.
    Il comando in basso aiuta a ottenere il numero di negativo o di qualsiasi altro simbolico relazione logica.
    Si supponga di avere un dataframe : df <- dati.telaio(x=c(2,5,-10,NA,7), y=c(81,-1001,-1,NA,-991))
    In ordine per ottenere il numero di record negativi in x : ‘nrow(df[df$x<0,])’

    OriginaleL’autore sentinel.bali

Lascia un commento