【问题标题】:How to calculate the average birthyear of offspring in R?如何计算R中后代的平均出生年份?
【发布时间】:2021-05-25 16:33:38
【问题描述】:

我想知道每个人直系后代的平均出生年份。 'pedigree' 包有一个函数 (countOff),可以计算所有后代,包括孙辈,这不是我想要的。这是我的数据框(df):

ID <- 1:30
MomID <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 1,2,1,2,6,8,6,10,11,13,16,19,16,13,16,20,19,16,19,20,23)
DadID <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA,3,4,5,5,7,4,9,7,7,14,18,7,15,18,18,17,21,14,18,21,17)
Birthyear <- c(1975, 1975, 1976, 1977, 1977, 1977, 1977, 1978, 1978, 1980, 1981, 1982, 1982, 1984, 1984, 1985, 1985, 1985, 1988, 1989, 1990, 1990, 1991, 1992, 1993, 1993, 1993, 1995, 1995, 1996)
df <- dataframe(ID,MomID, DadID, Birthyear)

   ID MomID DadID Birthyear
1   1    NA    NA      1975
2   2    NA    NA      1975
3   3    NA    NA      1976
4   4    NA    NA      1977
5   5    NA    NA      1977
6   6    NA    NA      1977
7   7    NA    NA      1977
8   8    NA    NA      1978
9   9    NA    NA      1978
10 10     1     3      1980
11 11     2     4      1981
12 12     1     5      1982
13 13     2     5      1982
14 14     6     7      1984
15 15     8     4      1984
16 16     6     9      1985
17 17    10     7      1985
18 18    11     7      1985
19 19    13    14      1988
20 20    16    18      1989
21 21    19     7      1990
22 22    16    15      1990
23 23    13    18      1991
24 24    16    18      1992
25 25    20    17      1993
26 26    19    21      1993
27 27    16    14      1993
28 28    19    18      1995
29 29    20    21      1995
30 30    23    17      1996

为此,我需要为每个人计算他们拥有的后代数量,然后平均这些后代的出生年份。每个个体的后代数量可以是数据框中的另一列,后代的平均出生年份也是如此。有什么想法吗?

【问题讨论】:

    标签: r dataframe count average


    【解决方案1】:

    这是你想要的吗

    df2 <- df %>% pivot_longer(c(MomID, DadID), names_to = "parent_type", values_to = "parent_id") 
    
    df2 %>% left_join(df2, by = c("ID" = "parent_id"), suffix = c("p", "o")) %>%
      select(-parent_typep) %>% group_by(ID, IDo) %>% slice_head() %>%
      group_by(ID) %>%
      summarise(OffspringCount = n(),
                AvBirthYear = mean(Birthyearo))
    
          ID OffspringCount AvBirthYear
     * <dbl>          <int>       <dbl>
     1     1              2       1981 
     2     2              2       1982.
     3     3              1       1980 
     4     4              2       1982.
     5     5              2       1982 
     6     6              2       1984.
     7     7              4       1986 
     8     8              1       1984 
     9     9              1       1985 
    10    10              1       1985 
    # ... with 20 more rows
    

    【讨论】:

      【解决方案2】:

      您可以在sapply 中使用mean,并在df$Birthyear 中使用df$ID

      df$AvBirthYear <- sapply(df$ID, function(i) mean(df$Birthyear[df$MomID == i |
                 df$DadID==i], na.rm=TRUE))
       head(df)
      #  ID MomID DadID Birthyear AvBirthYear
      #1  1    NA    NA      1975      1981.0
      #2  2    NA    NA      1975      1981.5
      #3  3    NA    NA      1976      1980.0
      #4  4    NA    NA      1977      1982.5
      #5  5    NA    NA      1977      1982.0
      #6  6    NA    NA      1977      1984.5
      

      【讨论】:

        【解决方案3】:

        一种可能不那么复杂,而且更“婴儿步骤”的方法:

        ID 为 Mom 时查找,ID 为 Dad 时查找,获取出生年份,计算并取平均值。

            df %>%
                left_join( df, c("ID" = "MomID") ) %>%                                ## Add offspring if mom
        
                left_join( df, c("ID" = "DadID") ) %>%                                ## Add offspring if dad
        
                mutate( BirthyearOffspring = coalesce( Birthyear.y, Birthyear ) ) %>% ## Merge birthyears to one column
        
                group_by( ID ) %>%                                                    ## Always need to group when making summaries
        
                summarize(
                    OffspringAvgBirthyear = mean( BirthyearOffspring, na.rm=TRUE ),   
                    OffspringCount        = length( BirthyearOffspring )
                ) %>% print.data.frame # to see digits
        

        输出:

            #    ID OffspringAvgBirthyear OffspringCount
            # 1   1              1981.000              2
            # 2   2              1981.500              2
            # 3   3              1980.000              1
            # 4   4              1982.500              2
            # 5   5              1982.000              2
            # 6   6              1984.500              2
            # 7   7              1986.000              4
            # 8   8              1984.000              1
            # [...]
        

        【讨论】:

        • 感谢您的帮助!我注意到,对于根本没有任何后代的个人(个人 12、22 和 25 到 30),您的代码仍然给出 OffspringCount == 1,而实际上它应该为 0。知道为什么吗? (顺便说一句,您的回答非常清楚,非常有帮助)
        • 没关系,我想通了!我更改了OffspringCount = length(BirthyearOffspring[!is.na( BirthyearOffspring )]),然后只有拥有后代的个体才有 OffspringCount。
        • 酷!没有什么比看到学生开始教他们的老师更好的了!
        猜你喜欢
        • 2019-12-05
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 2023-01-17
        • 2018-04-12
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多