2015-12-08 7 views
1

Je souhaite filtrer à partir d'un bloc de données toutes les variables ayant des valeurs négatives. J'ai utilisé cette ligne de code (ci-dessous) pour obtenir les noms des colonnes, mais comment puis-je enregistrer les colonnes positives avec leurs données comme une nouvelle trame de donnéesComment filtrer les colonnes qui ont des valeurs négatives et enregistrer le reste des colonnes dans une nouvelle trame de données

dat <- read.table(text = " value jobs chairs tables  lamps vases 
           -1  0  0  0   7 9 
           2  0  0  1   1 6 
           -3  0  1  0   3 5 
           4  0  1  1   7 8 
           -5  1  0  0   5 4 
           -6  1  0  1   1 3 
           7  1  1  0   0 7 
           8  1  1  1   6 6 
           9  0  0  0   8 9 ", header = TRUE) 

names(dat)[sapply(dat, function(x) min(x))>=0] 
[1] "value" "jobs" "chairs" "tables" "lamps" "vases" 
+5

Quelle est votre sortie désirée? Est-ce que 'dat [, colSums (dat <0) == 0]' fonctionne pour vous? Ou 'dat [, colSums (spply (dat," <", 0)) == 0]' afin d'éviter la conversion 'matrix' –

+0

Oui, merci @David Arenburg – mql4beginner

+0

@DavidArenburg que voulez-vous dire 'afin de éviter la conversion 'matrix' '? Les sorties de vos deux suggestions sont 'data.frames'. –

Répondre

3

Utilisez les noms que vous avez récupéré au sous-ensemble de votre trame de données:

myNames<-names(dat)[sapply(dat, function(x) min(x))>=0] 
dat[,myNames] 

Edit: si vous n'avez pas besoin de ces noms pour une utilisation ultérieure:

dat[,sapply(dat, min)>=0] 
+3

* Vous Pouvez * J'utiliserais je dirais. Il existe de nombreuses façons de peiner un chat. –

1

ou

dat[, sapply(dat, FUN = function(x) all(x >= 0))] 

ou

dat[, sapply(dat, FUN = function(x) !any(x < 0))]