R 从一个数据帧计算发病率,将结果输入另一个数据帧

R 从一个数据帧计算发病率,将结果输入另一个数据帧,r,R,我有两个数据框架:家庭和个人 这是家庭: 这是个人: 我正在尝试向住户添加一个新列,该列计算变量Yesno等于1的次数,按ID对结果进行分组 我试过了 households$Count <- as.numeric(ave(individuals$Yesno[individuals$Yesno == 1], households$ID, FUN = count)) 选项1:以R为底 使用合并和聚合 选项2:使用dplyr 使用left_join和group_by+摘要 样本数据 选项1:以

我有两个数据框架:家庭和个人

这是家庭:

这是个人:

我正在尝试向住户添加一个新列,该列计算变量Yesno等于1的次数,按ID对结果进行分组

我试过了

households$Count <- as.numeric(ave(individuals$Yesno[individuals$Yesno == 1], households$ID, FUN = count))
选项1:以R为底 使用合并和聚合

选项2:使用dplyr 使用left_join和group_by+摘要

样本数据 选项1:以R为底 使用合并和聚合

选项2:使用dplyr 使用left_join和group_by+摘要

样本数据
使用sapply的另一个基本R方法是循环家庭中的每个ID和来自个人的ID子集,并计算其中有多少人在Yesno列中有1


如果Yesno列只有0和1,则可以删除函数中的==1部分。

使用sapply的另一个基本R方法是循环家庭中的每个ID以及个人ID的子集,并计算其中有多少人在Yesno列中有1


如果Yesno列只有0和1,则可以删除函数中的==1部分。

谢谢!这对我来说效果更好,更有意义。我是新手,没有时间学习dplyr或data.table,但速度也慢了很多。@Werner这对我来说效果更好,更有意义。我是新手,没有时间学习dplyr或data.table,但速度也慢了很多。为了澄清,我在回答中给出的第一个解决方案是base R。谢谢!这对我来说效果更好,更有意义。我是新手,没有时间学习dplyr或data.table,但速度也慢了很多。@Werner这对我来说效果更好,更有意义。我是新手,没有时间学习dplyr或data.table,但速度也慢了很多。为了澄清,我在回答中给出的第一个解决方案是base R。
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))
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
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
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
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))
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