dplyr вычисляет новый столбец, применяя функцию суммирования на другом кадре данных - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу создать новый столбец (CNT) в кадре данных с именем df.Значение будет рассчитано с использованием функции summarise из пакета dplyr.Он должен возвращать число, так как мне нужно посчитать столбец в другом кадре данных (= cars), однако условия для фильтрации определяются значениями в 2 столбцах df.

фрейм данных:

library(dplyr)
df <- data.frame("my_speed" = 11:20, "my_dist" = c(17,20,15,17,21,23,28,36,50,80))

Например, это расчет для первой строки df.

x=df[1,1]
y=df[1,2]

cars %>% 
group_by(speed) %>% 
filter(speed==x & dist==y) %>% 
summarise(count=n()) %>% 
select (count)

Iя пытаюсь выяснить, как я могу использовать summarise() или другой метод, чтобы сделать это легко.Обратите внимание, что если summarise() не возвращает записей, мы должны показать ноль.

df %>% 
rowwise() %>%
filter(speed==my_spped & dist==my_dist) %>% 
summarise(count=n()) %>% 
select (count) %>% 
mutate(CNT=count)

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

С помощью rowwise мы можем получить sum логического выражения напрямую, вместо выполнения дополнительных операций

df %>% 
   rowwise %>% 
   mutate(CNT = sum((cars$speed == my_speed) & (cars$dist == my_dist)))
# A tibble: 10 x 3
#   my_speed my_dist   CNT
#      <int>   <dbl> <int>
# 1       11      17     1
# 2       12      20     1
# 3       13      15     0
# 4       14      17     0
# 5       15      21     0
# 6       16      23     0
# 7       17      28     0
# 8       18      36     0
# 9       19      50     0
#10       20      80     0
0 голосов
/ 01 февраля 2019

Решение

library(dplyr)

cars %>%
  count(speed, dist) %>%                   # count unique (speed, dist) pairs
  right_join(dat) %>%                      # join to dat, drop all not in dat
  mutate(CNT = coalesce(n, 0L), n = NULL)  # replace NA, create CNT, drop n

Данные

dat <- data.frame(
  speed = 11:20,
  dist = c(17, 20, 15, 17, 21, 23, 28, 36, 50, 80)
  )

Вывод

# A tibble: 10 x 3
   speed  dist   CNT
   <dbl> <dbl> <int>
 1    11    17     1
 2    12    20     1
 3    13    15     0
 4    14    17     0
 5    15    21     0
 6    16    23     0
 7    17    28     0
 8    18    36     0
 9    19    50     0
10    20    80     0
0 голосов
/ 01 февраля 2019

Мы можем определить функцию

library(tidyverse)

get_count <- function(x, y) {
   cars %>% 
    summarise(count = sum(speed == x & dist == y)) %>% 
    pull(count)
}

и применить ее для каждой строки, используя map2

df %>%
  mutate(CNT = map2(my_speed, my_dist, get_count))


#   my_speed my_dist   CNT
#1        11      17     1
#2        12      20     1
#3        13      15     0
#4        14      17     0
#5        15      21     0
#6        16      23     0
#7        17      28     0
#8        18      36     0
#9        19      50     0
#10       20      80     0

Базовый эквивалент R того же самого, используя applyбудет

get_count <- function(x) {
  nrow(subset(cars, speed == x[1] & dist == x[2]))
}

df$CNT <- apply(df, 1, get_count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...