Countifs-functie (Excel) in R

Ik heb een dataset met 100000 rijen gegevens. Ik heb geprobeerd om wat countifOperations in Excel te doen, maar het was onbetrouwbaar. Dus ik vraag me af of dit soort operatie in r kan worden gedaan? Kortom, ik wil een telling doen op basis van meerdere omstandigheden. Ik kan bijvoorbeeld rekenen op zowel bezetting als seks

row sex occupation
  1   M    Student
  2   F    Analyst
  2   M    Analyst

Antwoord 1, Autoriteit 100%

Easy Peasy. Uw gegevensframe ziet er als volgt uit:

df <- data.frame(sex=c('M','F','M'),
                 occupation=c('Student','Analyst','Analyst'))

U kunt dan het equivalent van een COUNTIFdoen door eerst de IFPART op te geven, zoals SO:

df$sex == 'M'

Hiermee geeft u een Booleaanse vector, d.w.z. een vector van TRUEen FALSE. Wat u wilt is om de opmerkingen te tellen waarvoor de toestand TRUEis. Aangezien in R TRUEEN FALSEDUBBELEN ALS 1 EN 0 U kunt eenvoudig sum()over de Booleaanse vector. Het equivalent van COUNTIF(sex='M')is daarom

sum(df$sex == 'M')

Mochten er rijen zijn waarin de sexniet is opgegeven, geeft het bovenstaande NA. In dat geval, als u gewoon de ontbrekende opmerkingen wilt negeren, gebruikt u

sum(df$sex == 'M', na.rm=TRUE)

Antwoord 2, Autoriteit 31%

Hier een voorbeeld met 100000 rijen (bezettingen worden hier van A tot Z ingesteld):

> a = data.frame(sex=sample(c("M", "F"), 100000, replace=T), occupation=sample(LETTERS, 100000, replace=T))
> sum(a$sex == "M" & a$occupation=="A")
[1] 1882

retourneert het aantal mannen met beroep “A”.

BEWERKEN

Zoals ik uit je opmerking begrijp, wil je de tellingen van alle mogelijke combinaties van geslacht en beroep.
Maak dus eerst een dataframe met alle combinaties:

combns = expand.grid(c("M", "F"), LETTERS)

en herhaal met applyom uw criteria op te tellen en voeg de resultaten toe aan combns:

combns = cbind (combns, apply(combns, 1, function(x)sum(a$sex==x[1] & a$occupation==x[2])))
colnames(combns) = c("sex", "occupation", "count")

De eerste rijen van uw resultaat zien er als volgt uit:

 sex occupation count
1   M          A  1882
2   F          A  1869
3   M          B  1866
4   F          B  1904
5   M          C  1979
6   F          C  1910

Lost dit je probleem op?

OF:

Veel eenvoudigere oplossing voorgesteld door thelatemai:

table(a$sex, a$occupation)
       A    B    C    D    E    F    G    H    I    J    K    L    M    N    O
  F 1869 1904 1910 1907 1894 1940 1964 1907 1918 1892 1962 1933 1886 1960 1972
  M 1882 1866 1979 1904 1895 1845 1946 1905 1999 1994 1933 1950 1876 1856 1911
       P    Q    R    S    T    U    V    W    X    Y    Z
  F 1908 1907 1883 1888 1943 1922 2016 1962 1885 1898 1889
  M 1928 1938 1916 1927 1972 1965 1946 1903 1965 1974 1906

Antwoord 3, Autoriteit 4%

Gegeven een dataset

df <- data.frame( sex = c('M', 'M', 'F', 'F', 'M'), 
                  occupation = c('analyst', 'dentist', 'dentist', 'analyst', 'cook') )

U kunt rijen

df[df$sex == 'M',] # To get all males
df[df$occupation == 'analyst',] # All analysts

enz.

Als u het aantal rijen wilt krijgen, belt u gewoon de functie nrowzoals

nrow(df[df$sex == 'M',])

Antwoord 4, Autoriteit 4%

Tabel is de voor de hand liggende keuze, maar het retourneert een object van de klas table, die een paar irritante stappen duurt om terug te veranderen in een data.frame
Dus, als u in orde bent met DLYR, gebruikt u de opdracht tally:

   library(dplyr)
    df = data.frame(sex=sample(c("M", "F"), 100000, replace=T), occupation=sample(c('Analyst', 'Student'), 100000, replace=T)
    df %>% group_by_all() %>% tally()
# A tibble: 4 x 3
# Groups:   sex [2]
  sex   occupation `n()`
  <fct> <fct>      <int>
1 F     Analyst    25105
2 F     Student    24933
3 M     Analyst    24769
4 M     Student    25193

Antwoord 5, Autoriteit 4%

library(matrixStats)
> data <- rbind(c("M", "F", "M"), c("Student", "Analyst", "Analyst"))
> rowCounts(data, value = 'M') # output = 2 0
> rowCounts(data, value = 'F') # output = 1 0

Other episodes