Ik heb een dataset met 100000 rijen gegevens. Ik heb geprobeerd om wat countif
Operations 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 COUNTIF
doen door eerst de IF
PART op te geven, zoals SO:
df$sex == 'M'
Hiermee geeft u een Booleaanse vector, d.w.z. een vector van TRUE
en FALSE
. Wat u wilt is om de opmerkingen te tellen waarvoor de toestand TRUE
is. Aangezien in R TRUE
EN FALSE
DUBBELEN 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 sex
niet 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 apply
om 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 nrow
zoals
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