Как я могу создать новый столбец с подсчетом совпадений определенного числа из столбца в другой таблице? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть два фрейма данных: «домашние хозяйства» и «физические лица».

Это «домашние хозяйства»:

structure(list(ID = 1:5), class = "data.frame", row.names = c(NA, 
-5L))

Это «индивидуумы»:

structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
3L, 4L, 4L, 4L, 4L, 5L, 5L), Yesno = c(1L, 0L, 1L, 0L, 0L, 0L, 
1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-17L))

Я пытаюсь добавить новый столбец в домохозяйства, в котором подсчитывается, сколько раз переменная Yesno равна 1, группируя результаты по идентификатору.

Я пытался

households$Count <- as.numeric(ave(individuals$Yesno[individuals$Yesno == 1], households$ID, FUN = count))

домохозяйства должны выглядеть так:

ID  Count
1   2
2   3
3   0
4   2
5   1

Ответы [ 2 ]

4 голосов
/ 11 апреля 2019

Вариант 1: В базе R

Использование merge и aggregate

aggregate(Yesno ~ ID, merge(households, individuals), FUN = sum)
#  ID Yesno
#1  1     2
#2  2     3
#3  3     0
#4  4     2
#5  5     1

Вариант 2: С dplyr

Использование left_join иgroup_by + summarise

library(dplyr)
left_join(households, individuals) %>%
    group_by(ID) %>%
    summarise(Count = sum(Yesno))
#Joining, by = "ID"
## A tibble: 5 x 2
#     ID Count
#  <int> <int>
#1     1     2
#2     2     3
#3     3     0
#4     4     2
#5     5     1

Вариант 3: С data.table

library(data.table)
setDT(households)
setDT(individuals)
households[individuals, on = "ID"][, .(Count = sum(Yesno)), by = ID]
#   ID Count
#1:  1     2
#2:  2     3
#3:  3     0
#4:  4     2
#5:  5     1

Пример данных

households <- structure(list(ID = 1:5), class = "data.frame", row.names = c(NA,
-5L))

individuals <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L,
3L, 4L, 4L, 4L, 4L, 5L, 5L), Yesno = c(1L, 0L, 1L, 0L, 0L, 0L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA,
-17L))
1 голос
/ 11 апреля 2019

Другой базовый подход R, использующий sapply, состоит в том, чтобы зациклить каждый ID в households и подмножество ID из individuals и подсчитать, сколько из них имеет 1 в столбце Yesno.

households$Count <- sapply(households$ID, function(x) 
                   sum(individuals$Yesno[individuals$ID == x] == 1))

households
#  ID Count
#1  1     2
#2  2     3
#3  3     0
#4  4     2
#5  5     1

Часть == 1 в функции можно удалить, если в столбце Yesno есть только 0 и 1.

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