【问题标题】:Working with multiple rows with same Id (key) column value in R在 R 中使用具有相同 Id(键)列值的多行
【发布时间】:2015-09-01 21:47:33
【问题描述】:

我正在处理人口普查数据。数据集的样子是:

Household-Id    Member-Type    Education    Birth
1               Father         12           1955
1               Mother         16           1963
1               Child          16           1986
1               Child          12           1995
2               Father         12           1950
2               Mother         9            1955
2               Child          18           1982
2               Child          14           1985
2               Child          16           1975
3               Father         16           1962
3               Mother         14           1965
3               Child          16           1990

我希望它看起来像:

Household-Id    Member-Type    Education    Birth    Mother-Education    Birth-Order 
1               Father         12           1955     
1               Mother         16           1963
1               Child          16           1986     16                  1
1               Child          12           1995     16                  2
2               Father         12           1950
2               Mother         9            1955
2               Child          18           1982     9                   1
2               Child          14           1985     9                   2
2               Child          16           1975     9                   3
3               Father         16           1962
3               Mother         14           1965
3               Child          16           1990     14                  1

据我所知,R 不像 Java 或 C 等语言那样支持循环操作,而且我真的不知道如何做到这一点!

【问题讨论】:

    标签: r dataframe data.table dplyr


    【解决方案1】:

    您从哪里听说 R 不支持循环?确实如此 - 这种特殊情况听起来最适合data.table(内部使用循环)

    install.packages("data.table")
    library(data.table)
    dat = as.data.table(YourDataFrame)
    
    dat[Member.Type == "Child", Birth_Order:=rank(Birth) ,by=Household.Id]
    dat[, MotherEducation := Education[Member.Type=="Mother"] , by=Household.Id]
    dat[Member.Type != "Child", MotherEducation := NA]
    dat
    #   Household.Id Member.Type Education Birth MotherEducation Birth_Order
    #  1:            1      Father        12  1955              NA          NA
    #  2:            1      Mother        16  1963              NA          NA
    #  3:            1       Child        16  1986              16           1
    #  4:            1       Child        12  1995              16           2
    #  5:            2      Father        12  1950              NA          NA
    #  6:            2      Mother         9  1955              NA          NA
    #  7:            2       Child        18  1982               9           2
    #  8:            2       Child        14  1985               9           3
    #  9:            2       Child        16  1975               9           1
    # 10:            3      Father        16  1962              NA          NA
    # 11:            3      Mother        14  1965              NA          NA
    # 12:            3       Child        16  1990              14           1
    

    【讨论】:

    • 我是业余爱好者!谢谢。
    • 你最后一行的:= 发生了什么? :)
    【解决方案2】:

    这是dplyr 方法:

    library(dplyr)
    
    dat = dat %>% group_by(Household.Id, Member.Type) %>% 
      arrange(Birth) %>%
      mutate(Birth_Order = 1:n(),
             Birth_Order = ifelse(Member.Type=="Child", Birth_Order, NA_integer_)) %>%
      group_by(Household.Id) %>%
      mutate(Mother_Education = ifelse(Member.Type=="Child", 
                                       Education[Member.Type=="Mother"], NA))
    
       Household.Id Member.Type Education Birth Birth_Order Mother_Education
    1             1       Child        16  1986           1               16
    2             1       Child        12  1995           2               16
    3             1      Father        12  1955          NA               NA
    4             1      Mother        16  1963          NA               NA
    5             2       Child        16  1975           1                9
    6             2       Child        18  1982           2                9
    7             2       Child        14  1985           3                9
    8             2      Father        12  1950          NA               NA
    9             2      Mother         9  1955          NA               NA
    10            3       Child        16  1990           1               14
    11            3      Father        16  1962          NA               NA
    12            3      Mother        14  1965          NA               NA
    

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2022-01-24
      • 2022-01-21
      相关资源
      最近更新 更多