我有一個包含100000行數據的數據集。我試圖在Excel中執行一些countif
操作,但速度過於緩慢。所以我想知道這種操作是否可以在R中完成?基本上,我想根據多個條件進行計數。例如,我可以指望職業和性別如何在R中實現countifs函數(excel)
row sex occupation
1 M Student
2 F Analyst
2 M Analyst
我有一個包含100000行數據的數據集。我試圖在Excel中執行一些countif
操作,但速度過於緩慢。所以我想知道這種操作是否可以在R中完成?基本上,我想根據多個條件進行計數。例如,我可以指望職業和性別如何在R中實現countifs函數(excel)
row sex occupation
1 M Student
2 F Analyst
2 M Analyst
容易peasy。您的數據幀看起來就像這樣:
df <- data.frame(sex=c('M','F','M'),
occupation=c('Student','Analyst','Analyst'))
然後,您可以先指定IF
部分,像這樣做COUNTIF
相當於:
df$sex == 'M'
這會給你一個布爾載體,即TRUE
和FALSE
的載體。你想要的是計算條件爲TRUE
的觀測值。由於在R TRUE
和FALSE
中加倍爲1和0,您可以簡單地通過布爾向量sum()
。的COUNTIF(sex='M')
等效因此
sum(df$sex == 'M')
如果有其中sex
未指定上述會給背面NA
行。在這種情況下,如果你只是想忽略缺失觀察使用
sum(df$sex == 'M', na.rm=TRUE)
給定數據集
df <- data.frame(sex = c('M', 'M', 'F', 'F', 'M'),
occupation = c('analyst', 'dentist', 'dentist', 'analyst', 'cook'))
可以子集行
df[df$sex == 'M',] # To get all males
df[df$occupation == 'analyst',] # All analysts
等
如果您想要獲得行數,只需調用函數nrow
,如
nrow(df[df$sex == 'M',])
在這裏與100000點的行的示例(職業在此處設置從A到Z):
> 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
返回與職業 「A」 的男性的數量。
編輯
當我從您的評論理解,你想性別和職業的所有可能組合的計數。 因此,首先創建一個數據幀的所有組合:
combns = expand.grid(c("M", "F"), LETTERS)
和循環與apply
總結爲您的標準並追加結果combns
:
combns = cbind (combns, apply(combns, 1, function(x)sum(a$sex==x[1] & a$occupation==x[2])))
colnames(combns) = c("sex", "occupation", "count")
你的結果看的第一行,如下所示:
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
這是否解決您的問題?
OR:
很多簡單的解決方案建議通過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
,你們會所需的輸出? 'table'或'aggregate'或者類似的函數可能就是你想要的。 – thelatemail
你可以在Excel中使用數據透視表。 – flodel