0
votes

Comptez le nombre de colonnes pour chaque ligne par condition de caractère et manquantes

Je veux compter le nombre de colonnes pour chaque ligne par condition de caractère et manquantes.

Par exemple, j'ai ce jeu de données, test

Je veux Pour créer des colonnes num , comptant le nombre de colonnes "non" dans la valeur manquante ou vide. xxx

Je veux compter le nombre de colonnes contenant na et de valeur vide comme xxx

J'ai essayé une approche dans d'autres messages, comme Rowsums Nombre de colonnes par une condition (>) pour chaque ligne xxx

Cependant, il renvoie des numéros incorrects et je n'ai pas pu trouver les raisons.

Pourriez-vous me faire savoir comment pour résoudre ce problème?


0 commentaires

4 Réponses :


4
votes

Vous pouvez utiliser rowsums code> pour compter le numéro de NA code> S ou des valeurs vides dans chaque ligne, puis soustrayez-le du nombre de colonnes dans le Dataframe.

test$num <- ncol(test) - rowSums(is.na(test) | test == "")
test
#     a    b    c    d num
#1   aa        aa   aa   3
#2   bb <NA>        bb   2
#3   cc   aa <NA>        2
#4   dd      <NA> <NA>   1
#5             cc   cc   2
#6 <NA>   dd   dd   dd   3


2 commentaires

Supprimé ma réponse depuis qu'il était trop proche de la vôtre: rowsums (test! = "" &! Is.na (test))


@sindri_baldur Je pense que c'est assez différent d'être une réponse séparée.



3
votes

Une autre idée à l'aide de Rowsums code> est de remplacer vide avec NA, c'est-à-dire

rowSums(!is.na(replace(test, test == '', NA)))
#[1] 3 2 2 1 2 3


0 commentaires

3
votes

Vous pouvez utiliser nchar + rowsums xxx

ou % in% + rowsums xxx

tel que xxx


0 commentaires

2
votes

Que diriez-vous de cette approche de la tenie tendule qui vous indique également combien de colonnes contiennent des nas ou des chaînes vides?

a<-c("aa","bb","cc","dd","",NA)
b<-c("",NA,"aa","","","dd")
c<-c("aa","",NA,NA,"cc","dd")
d<-c("aa","bb","",NA,"cc","dd")
test<-data.frame(cbind(a,b,c,d))

library(magrittr) #import the pipe operator

num_cols <- test %>% 
    tibble::rowid_to_column("row_id") %>% #1st add a rowid column 
    dplyr::group_by(row_id) %>% #split the data into single row groups (i.e. 
                                #row vectors)
    tidyr::nest() %>% #turn it into a list column called data
    dplyr::mutate(num_NAs = purrr::map_dbl(data, #loop over the data column of row 
                                                  #vectors using map_dbl
                                     ~sum(is.na(.))), #count the number of NAs
                  num_empty = purrr::map_dbl(data, 
                                         #count the empty strings 
                                         ~sum(. == "", na.rm = T)),
                  num_values = purrr::map_dbl(data, 
                                          #count columns without NAs or 
                                          #missing values (what you asked for)
                                          ~length(.)-sum(num_NAs, num_empty))
            ) %>%
    dplyr::ungroup() %>% #remove the grouping structure
    dplyr::select(num_NAs, num_empty, num_values) #extract only the variables you need

test_v2 <- cbind(test, num_cols)
test_v2  

     a    b    c    d num_NAs num_empty num_values
1   aa        aa   aa       0         1          3
2   bb <NA>        bb       1         1          2
3   cc   aa <NA>            1         1          2
4   dd      <NA> <NA>       2         1          1
5             cc   cc       0         2          2
6 <NA>   dd   dd   dd       1         0          3


1 commentaires

Bien que cette solution nécessite plus de code que les autres options, cela vous donne plus d'informations (si vous le souhaitez). Vous pouvez également insérer facilement une couche SELECT () au début (avant la couche GROUP_BY) pour appliquer uniquement ces règles de comptage dans un sous-ensemble de colonnes si vous ne vouliez pas obtenir de compte pour l'ensemble de laacrame.