如何在R中实现countifs功能(excel)

Law*_*nce 8 r

我有一个包含100000行数据的数据集.我尝试countif在Excel中进行一些操作,但速度非常慢.所以我想知道这种操作是否可以在R中完成?基本上,我想根据多种条件进行计数.例如,我可以依靠职业和性别

row sex occupation
  1   M    Student
  2   F    Analyst
  2   M    Analyst
Run Code Online (Sandbox Code Playgroud)

Roy*_*lTS 14

十分简单.您的数据框将如下所示:

df <- data.frame(sex=c('M','F','M'),
                 occupation=c('Student','Analyst','Analyst'))
Run Code Online (Sandbox Code Playgroud)

然后,您可以COUNTIF通过首先指定IF部件来执行等效操作,如下所示:

df$sex == 'M'
Run Code Online (Sandbox Code Playgroud)

这会给你一个布尔矢量,即矢量TRUEFALSE.你想要的是计算条件的观察结果TRUE.因为在R中TRUE,FALSEdouble和1和0可以简单地sum()超过布尔向量.的等效COUNTIF(sex='M')因此是

sum(df$sex == 'M')
Run Code Online (Sandbox Code Playgroud)

如果有sex未指定的行,则上述将返回NA.在这种情况下,如果你只是想忽略缺失的观察结果

sum(df$sex == 'M', na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)


use*_*275 5

下面是一个具有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
Run Code Online (Sandbox Code Playgroud)

返回职业为“ A”的男性人数。

编辑

据我从您的评论中了解到,您希望计算性别和职业的所有可能组合。因此,首先创建一个具有所有组合的数据框:

combns = expand.grid(c("M", "F"), LETTERS)
Run Code Online (Sandbox Code Playgroud)

并循环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")
Run Code Online (Sandbox Code Playgroud)

结果的第一行如下所示:

  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
Run Code Online (Sandbox Code Playgroud)

这样可以解决您的问题吗?

要么:

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
Run Code Online (Sandbox Code Playgroud)