2017-07-10 1 views
1

Je tente d'écrire un programme dans R qui crée une table à partir d'un fichier .csv qui sera 1856 x 9 éléments. Cette partie fonctionne. Ensuite, je voudrais parcourir chaque cellule de cette table, en commençant dans le coin supérieur droit de la table, et reculer d'un rang, puis descendre à la rangée suivante et faire la même chose.En boucle dans une table dans R

Si la ligne contient tous des zéros ou a 1 1 1 0 0 0 ou quelque chose de similaire, je souhaite la supprimer. Si la ligne a toutes les valeurs non nulles, puis zéro à droite, supprimez-le

S'il existe une valeur non nulle dans une cellule à droite d'une cellule avec une valeur nulle, je veux garder la ligne dans la table.

Exemple:

Beginning of my table

Après mon code court, je veux que les lignes 1, 2, 3, 7 à rester.

+0

pourquoi voudriez-vous abandonner la ligne 1? Je ne comprends pas votre condition "a 1 1 1 0 0 0, ou quelque chose de similaire" –

+1

pourriez-vous énoncer les conditions en termes plus clairs. "quelque chose de similaire" n'est pas particulièrement utile. –

+0

Oui, je viens d'éditer le post principal. Fondamentalement, s'il y a une cellule dans la rangée qui est une valeur différente de zéro, et qu'il y a une valeur nulle à gauche de celle-ci, je veux la garder. Tout le reste devrait être supprimé. Excusez-moi de ne pas avoir été clair. – Mason

Répondre

2

Vous pouvez utiliser au lieu d'appliquer une boucle:

# recreate your example 
DF <- 
read.csv(
text="Company.Name,Seed,Series.A,Series.B,Series.C,Series.D,Series.E,Series.F,Series.G,Series.H 
Aetion,0,1,0,0,0,0,0,0,0 
Aspier Healt,1,0,1,0,0,0,0,0,0 
Evariant,0,1,1,2,0,0,0,0,0 
iHealth,0,0,0,0,0,0,0,0,0 
Inuition Robotics,0,0,0,0,0,0,0,0,0 
Kali Care,0,0,0,0,0,0,0,0,0 
Network Locum,0,0,1,0,0,0,0,0,0 
" 
) 

# This line does : 
# - for each row of DF excluding the first column DF[,-1] 
# - take the row without the last value x[-length(x)] and the 
# row without the first value x[-1] 
# - create a vector with TRUE where x[-length(x)] == 0 AND x[-1] != 0 
# so basically when a zero is followed by a non-zero 
# - if there's "any" (see the function) TRUE, then the condition is met 
# rowCondition will contain TRUE where the row condition is met, and FALSE otherwise 
rowCondition <- apply(DF[,-1],1,function(x) any(x[-length(x)] == 0 & x[-1] != 0)) 

# we use the condition to filter the necessary rows 
subsetDF <- DF[rowCondition,] 



> subsetDF 
    Company.Name Seed Series.A Series.B Series.C Series.D Series.E Series.F Series.G Series.H 
1  Aetion 0  1  0  0  0  0  0  0  0 
2 Aspier Healt 1  0  1  0  0  0  0  0  0 
3  Evariant 0  1  1  2  0  0  0  0  0 
7 Network Locum 0  0  1  0  0  0  0  0  0 
+0

Qu'est-ce que X? Aussi, pourquoi cela montre iHealth mais pas Intuition Robotics? – Mason

+0

Désolé, je ne sais pas pourquoi j'ai mis margin paramenter = 2 dans apply, au lieu de 1. Maintenant c'est correct. A propos de "x", est simplement l'argument de la fonction passée à s'appliquer, de sorte qu'il contient chaque ligne du data.frame à l'exclusion de la première colonne – digEmAll

1

Comme vous recherchez une ligne où il y a un 0 suivi d'un caractère non nul, il est possible de le faire en utilisant regex. La fonction retourne grepl un vecteur VRAI/FAUX selon que le pattern spécifié est adapté:

examples <- c("100", "000", "001") 
grepl(pattern = "0[1-9]", x = examples) 
## [1] FALSE FALSE TRUE 

Cette regex semble explicitement un chiffre 1-9 après un zéro, il vous vouliez ne importe quel caractère possible autre qu'un zéro vous En utilisant la bibliothèque dplyr, qui est chargée en appelant library("tidyverse"), il est très simple de concaténer les colonnes d'intérêt, puis d'appliquer notre regex à cette nouvelle colonne.

D'abord, enregistrez ce qui suit comme .csv

Company.Name, semences, série.Un, Series.B, Series.C, Series.D, Series.E, Series.F, Series.G , Série.H Aetion, 0,1,0,0,0,0,0,0,0 Aspier Healt, 1,0,1,0,0,0,0,0,0 Evariant, 0, 1,1,2,0,0,0,0,0 iHealth, 0,0,0,0,0,0,0,0,0 Inuition Robotique, 0,0,0,0,0,0 , 0,0,0 Kali Care, 0,0,0,0,0,0,0,0,0 Réseau Locum, 0,0,1,0,0,0,0,0,0 Martin Société, 0, 0, 0, 0, 0, 0, 0, 0, 1 Autre société, 1, 1, 1, 2, 1, 3, 6, 7, 9 Weird Company, 0, 0, 0 , 0, m, 0, 0, 0, 0

ensuite importer les données à l'aide read_csv:

library("tidyverse") 
example_data <- read_csv("example_data.csv") 

Maintenant, nous allons créer une nouvelle colonne contenant la concaténation des lignes Seed: Series.H

example_data <- example_data %>% 
    mutate(test_col = paste0(Seed, 
          Series.A, 
          Series.B, 
          Series.C, 
          Series.D, 
          Series.E, 
          Series.F, 
          Series.G, 
          Series.H)) 

Jetons un coup d'œil à la nouvelle valeur de la colonne pour la première ligne:

example_data %>% 
    select(test_col) %>% 
    slice(1) 
## 010000000 

Ok! Il y a donc un caractère non nul à droite d'un zéro! Donc cette ligne devrait être incluse dans la sortie.

Nous pouvons utiliser le verbe mutate pour appliquer le test grepl sur toutes les lignes d'une nouvelle colonne appelée include. Imprimons sur l'ensemble de cette colonne pour voir quelles lignes correspondent à votre état:

example_data %>% 
    mutate(include = grepl("0[1-9]", test_col)) %>% 
    select(include) 
## output 
# A tibble: 10 x 1 
    include 
    <lgl> 
1 TRUE 
2 TRUE 
3 TRUE 
4 FALSE 
5 FALSE 
6 FALSE 
7 TRUE 
8 TRUE 
9 FALSE 
10 FALSE 

Pour filtrer uniquement les lignes où la condition est vrai que nous utilisons le verbe filter:

example_data %>% 
    mutate(include = grepl("0[1-9]", test_col)) %>% 
    filter(include) 

Bien sûr, nous avons maintenant deux colonnes dans vos données que vous ne voulez pas! Alors écrivez tout cela de manière concise:

example_data %>% 
    mutate(test_col = paste0(Seed, 
          Series.A, 
          Series.B, 
          Series.C, 
          Series.D, 
          Series.E, 
          Series.F, 
          Series.G, 
          Series.H), 
     include = grepl("0[1-9]", test_col)) %>% 
    filter(include) %>% 
    select(-include, -test_col) 
+0

Pouvez-vous l'essayer sans regex? Je ne comprends vraiment pas. – Mason

+0

@Mason espère que l'explication élargie aide –