我需要从原始表(都在下面)创建一个表。

在原始表中,我们有家庭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

09-05 14:10