Как подсчитать новый столбец в кадре данных на основе значений в отдельном кадре данных? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть df1 с некоторыми повторяющимися почтовыми индексами:

    ZIP Weekend Sales
1 60657       1    1
2 60657       1    1
3 60657       1    1
4 60641       0   NA
5 60641       0   NA
6 60607       0   NA
7 60607       0    1
8 60628       0    1

У меня есть дополнительный df2 с 60 уникальными почтовыми индексами:

    ZCTA   ZIP Population
6  60657 60657      82739
7  60609 60609      64906
10 60612 60612      33472
13 60641 60641     40603
14 60616 60616      48433
15 60607 60607      84155
16 60628 60628      92084
17 60619 60619      63825

Я хотел бы создать новый столбец из df2 с названием Sites, которое представляет собой общее количество повторов почтового индекса в df1. Результат будет:

    ZCTA   ZIP Population  Sites
6  60657 60657      82739    3
7  60609 60609      64906    0
10 60641 60612      33472    2
13 60607 60615      40603    2
14 60616 60616      48433    0
15 60617 60617      84155    0
16 60628 60628      92084    1
17 60619 60619      63825    0

Ответы [ 2 ]

2 голосов
/ 07 мая 2020
library(dplyr)
df1 %>%
  group_by(ZIP) %>%
  tally(name = "Sites") %>%
  right_join(df2, by = "ZIP") %>%
  mutate(Sites = if_else(is.na(Sites), 0L, Sites))
# # A tibble: 8 x 4
#     ZIP Sites  ZCTA Population
#   <int> <int> <int>      <int>
# 1 60657     3 60657      82739
# 2 60609     0 60609      64906
# 3 60612     0 60612      33472
# 4 60641     2 60641      40603
# 5 60616     0 60616      48433
# 6 60607     2 60607      84155
# 7 60628     1 60628      92084
# 8 60619     0 60619      63825

Данные:

df1 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
  ZIP Weekend Sales
60657       1    1
60657       1    1
60657       1    1
60641       0   NA
60641       0   NA
60607       0   NA
60607       0    1
60628       0    1")

df2 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
 ZCTA   ZIP Population
60657 60657      82739
60609 60609      64906
60612 60612      33472
60641 60641     40603
60616 60616      48433
60607 60607      84155
60628 60628      92084
60619 60619      63825")
0 голосов
/ 07 мая 2020

Вы можете count и затем присоединиться.

library(dplyr)

df1 %>%
  count(ZIP, name = "Sites") %>%
  right_join(df2, by = 'ZIP') %>%
  mutate(Sites = replace(Sites, is.na(Sites), 0))

# A tibble: 8 x 4
#    ZIP Sites   ZCTA Population
#  <int> <dbl> <int>      <int>
#1 60657     3 60657      82739
#2 60609     0 60609      64906
#3 60612     0 60612      33472
#4 60641     2 60641      40603
#5 60616     0 60616      48433
#6 60607     2 60607      84155
#7 60628     1 60628      92084
#8 60619     0 60619      63825

В базе R это будет:

merge(df2, aggregate(Weekend~ZIP, df1, length), all.x = TRUE)

, а затем замените NA на 0, как обычно.

...