Преброяване на срещания в рамка с данни с две условия без for цикъл

В момента използвам набора от данни "диаманти" от пакета ggplot2. Искам да мога да преброя броя на диамантите, които отговарят на две условия в първите n наблюдения, в този случай цвят „E“ и чистота „SI2“. Написах функцията по-долу, която решава този проблем, но бих искал да мога да направя това, без да е необходимо да изпълнявам for цикъл. Има ли начин тази функция да работи без for цикъла? Наборът от данни съдържа 54 000 наблюдения.

library('ggplot2')
data(diamonds)

countfreq <- function(n) {
  #Set k to 0
  k <- 0
  for(i in 1:n) {
    if (diamonds$color[i] == 'E' & diamonds$clarity[i] == 'SI2') 
      k <- k + 1
  }
  return(k)
}

countfreq(50)
2
countfreq(100) 
3

Първите два реда на рамката с данни са както по-долу.

 carat  cut  color clarity  depth  table  price   x    y    z 
1 0.23 Ideal   E     SI2     61.5   55.0   326  3.95 3.98  2.43
2 0.21 Premium E     SI1     59.8   61.0   326  3.89 3.84  2.31 

person Macter    schedule 14.10.2017    source източник
comment
Моля, отбележете домашното като такова следващия път (веднага след като изчистите индексирането на кадрите с данни, векторизацията и векторизираните логически операции). nrow(diamonds[diamonds$color == 'E' & diamonds$clarity == 'SI2',])   -  person hrbrmstr    schedule 14.10.2017
comment
Съжалявам, редактирах по-горе, за да изясня, че бих искал да запазя функцията (за да мога лесно да променя n, без да дефинирам нови кадри с данни всеки път), но да загубя цикъла for.   -  person Macter    schedule 14.10.2017
comment
Наистина трябва да вземете присърце освежаването на индексирането, векторизацията и векторизираните логически операции. Отговорът на tidyverse, който приехте, е пресилен, по-бавен и ненужен.   -  person hrbrmstr    schedule 15.10.2017


Отговори (1)


Ще ви дам нещо, което ще отговори на въпроса ви и също ще ви помогне да разберете по-общ подход за отговаряне на въпроси като този с помощта на пакета dplyr

library(ggplot2)
library(dplyr)

diamonds %>% # take the diamonds data.fram and group it
    group_by(color, clarity) %>% # 56 groups
    summarize(count = n()) %>% # add a count column
    filter(color=="E", clarity=="SI2") %>%  # filter the row you want
    .$count # just the single value as a result

[1] 1713

Имайте предвид, че можете да стартирате всяка част от кода, за да видите междинните резултати. Например, за да видите таблицата на групите и броя за всяка, стартирайте само тази част:

diamonds %>% # take the diamonds data.fram and group it
        group_by(color, clarity) %>% # 56 groups
        summarize(count = n())

# A tibble: 56 x 3
# Groups:   color [?]
   color clarity count
   <ord>   <ord> <int>
 1     D      I1    42
 2     D     SI2  1370
 3     D     SI1  2083
 4     D     VS2  1697
 5     D     VS1   705
 6     D    VVS2   553
 7     D    VVS1   252
 8     D      IF    73
 9     E      I1   102
10     E     SI2  1713
# ... with 46 more rows
person Bobby    schedule 14.10.2017
comment
Видях, че сте приели отговора, но след това направих малка граматична редакция и забелязах, че зеленото квадратче за отметка изчезна. Можете да го приемете отново, ако желаете. Кажете ми, ако имате въпроси относно това как работи. - person Bobby; 14.10.2017