Добавление нового столбца в кадре данных, считая строки из другого кадра данных - PullRequest
0 голосов
/ 29 января 2019

Я искал на форумах решение, но не смог его найти.

У меня есть данные о финансовых результатах компаний в одном фрейме данных (df1) и данные о приобретениях, совершенных в другом фрейме данных (df2).Данные в том же формате, что и ниже.

df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
              year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
              year=c(2010,2010,2010,2011,2011))´

Моя цель - создать новый столбец в df1 со значениями, которые учитывают каждое наблюдение в df2, которое соответствует как идентификатору, так и году строки в df1.,Мне нужна переменная, которая подсчитывает количество приобретений, совершаемых каждой компанией каждый год.Ниже приведен желаемый результат.

#output should look like following in df1
# ID      year  count of observations in df2 per year
# 111111  2010  3
# 111111  2011  1
# 222222  2010  0
# 333333  2011  1
# 444444  2011  0

Я действительно пытался найти решение, но не подошел достаточно близко.Надеюсь, что у кого-нибудь найдется решение этой проблемы.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Нереверсивное решение.Я понимаю, что это кажется более сложным, чем tidyverse, просто поделился им с различными вариантами.

df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
                  year=c(2010, 2011, 2010, 2011, 2011))

df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
                  year=c(2010,2010,2010,2011,2011))


df1$key <- paste(df1$ID,df1$year,sep = "_")

df2$key <- paste(df2$ID,df2$year,sep = "_")


df1$count_of_year <- unlist(lapply(df1$key,function(x) {sum(df2$key %in% x)}))

df1 <- df1[,c(1,2,4)]

df1
#>       ID year count_of_year
#> 1 111111 2010             3
#> 2 111111 2011             1
#> 3 222222 2010             0
#> 4 333333 2011             1
#> 5 444444 2011             0

Создано в 2019-01-29 пакетом prex (v0.2.1)

0 голосов
/ 29 января 2019

Вероятно, лучший способ - использовать left_join, вам нужно всего лишь изменить NA на 0:

df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
                  year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
                  year=c(2010,2010,2010,2011,2011))

library(tidyverse)

df2 %>% count(ID, year) -> summ_df2

df1 %>% left_join(summ_df2)
#> Joining, by = c("ID", "year")
#> Warning: Column `ID` joining factors with different levels, coercing to
#> character vector
#>       ID year  n
#> 1 111111 2010  3
#> 2 111111 2011  1
#> 3 222222 2010 NA
#> 4 333333 2011  1
#> 5 444444 2011 NA

Создано в 2019-01-29 с помощью пакета Представить (v0.2.1)


Операция с одной цепью Добавлен следующий комментарий @Ronak Shah

df1 <- data.frame(ID=c('111111','111111', '222222', '333333', '444444'),
                  year=c(2010, 2011, 2010, 2011, 2011))
df2 <- data.frame(ID=c('111111', '111111', '111111', '111111', '333333'),
                  year=c(2010,2010,2010,2011,2011))

library(tidyverse)

df2 %>% 
 count(ID, year) %>% 
 right_join(df1) %>% 
 replace_na(list(n = 0))

#> Joining, by = c("ID", "year")
#> Warning: Column `ID` joining factors with different levels, coercing to
#> character vector
#> # A tibble: 5 x 3
#>   ID      year     n
#>   <chr>  <dbl> <dbl>
#> 1 111111  2010     3
#> 2 111111  2011     1
#> 3 222222  2010     0
#> 4 333333  2011     1
#> 5 444444  2011     0

Создано в 2019-01-29 * представительный пакет (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...