我需要从原始表(都在下面)创建一个表。
在原始表中,我们有家庭A和B,每个家庭的成员由PESS列指示。每个家庭的受益人在BEN列中以数字1标记。
从该表中,我需要生成一个新表,其中应有2列。以家庭A为例,成员1和4是受益人。然后,应将家庭A分为两组,一次只能有一个受益人(列I_BPC_FAM2)。 FAM2列指示组。
使用下面的代码,我正在生成新表,但是缺少I_BPC_FAM2列。该问题必须在R中解决。
是否有可能完成此代码以进入决赛桌?
library(tidyverse)
tabela<-data.frame(FAM=c("A","A","A","A","B","B","B"), PESS=c(1,2,3,4,1,2,3),BEN=c(1,0,0,1,0,0,1))
tabela1<- summarise(group_by(tabela,FAM),contador=sum(BEN),cont=n()) #faz a tabela com contadores
tab2<-NULL
for(i in 1:length(tabela1$FAM)){
x<-as.numeric(tabela1[i,"contador"])
j<-as.numeric(tabela1[i,"cont"])
for(l in 1:x){
for(k in 1:j){
tab<-data.frame(tabela1[i,"FAM"],PESS=as.numeric(k),FAM2=as.numeric(l))
tab2<-rbind(tab2,tab)
final<-merge(tab2,tabela,by=c("FAM","PESS"))
final <- final[order(final$FAM, final$FAM2), ]
}
}
}
原始表格:
> tabela
FAM PESS BEN
1 A 1 1
2 A 2 0
3 A 3 0
4 A 4 1
5 B 1 0
6 B 2 0
7 B 3 1
我的代码生成的表
> final
FAM PESS FAM2 BEN
1 A 1 1 1
3 A 2 1 0
5 A 3 1 0
7 A 4 1 1
2 A 1 2 1
4 A 2 2 0
6 A 3 2 0
8 A 4 2 1
9 B 1 1 0
10 B 2 1 0
11 B 3 1 1
我需要生成的表
FAM PESS FAM2 BEN I_BPC_FAM2
1 A 1 1 1 1
3 A 2 1 0 0
5 A 3 1 0 0
7 A 4 1 1 0
2 A 1 2 1 0
4 A 2 2 0 0
6 A 3 2 0 0
8 A 4 2 1 1
9 B 1 1 0 0
10 B 2 1 0 0
11 B 3 1 1 1
最佳答案
这是另一种方法:
table <-data.frame(FAM=c("A","A","A","A","B","B","B"),
PESS=c(1,2,3,4,1,2,3),
BEN=c(1,0,0,1,0,0,1))
为每个观察值创建唯一的ID:
table %<>% mutate( unique_id = row_number())
将您想要获得的独特家庭分组:
ben <-
table %>%
filter(BEN == 1) %>%
mutate(FAM2 = unique_id) %>%
select(FAM2, FAM)
> ben
FAM2 FAM
1 1 A
2 4 A
3 7 B
合并并比较ID:
new_table<- merge(ben, table, by = "FAM") %>%
mutate(I_BPC_FAM2 = as.integer(unique_id == FAM2)) %>%
select(-unique_id)
结果是:
new_table
> new_table
FAM FAM2 PESS BEN I_BPC_FAM2
1 A 1 1 1 1
2 A 1 2 0 0
3 A 1 3 0 0
4 A 1 4 1 0
5 A 4 1 1 0
6 A 4 2 0 0
7 A 4 3 0 0
8 A 4 4 1 1
9 B 7 1 0 0
10 B 7 2 0 0
11 B 7 3 1 1
您可以使用以下方法转换新的家庭ID:
> new_table %>% mutate(FAM2 = as.integer(as.factor(FAM2)))
FAM FAM2 PESS BEN I_BPC_FAM2
1 A 1 1 1 1
2 A 1 2 0 0
3 A 1 3 0 0
4 A 1 4 1 0
5 A 2 1 1 0
6 A 2 2 0 0
7 A 2 3 0 0
8 A 2 4 1 1
9 B 3 1 0 0
10 B 3 2 0 0
11 B 3 3 1 1