【问题标题】:I am trying to split my variable by 2 vectors in R, but split() doesn't seem to work我试图用 R 中的 2 个向量拆分我的变量,但 split() 似乎不起作用
【发布时间】:2020-06-24 17:54:33
【问题描述】:

例如,如果我有以下数据集(见下文),我将如何拆分数据,以便我可以按年份计算具有自己头发颜色的人(如所有红头发的人)的平均年龄?我已经尝试过拆分功能,但它只允许我制作两列子集。

所以我的目标是:2016 年金发人的平均年龄,2016 年棕色头发的人的平均年龄,等等。对于每种颜色,每年。

我对 R 很陌生,所以请用简单易懂的方法回答(对不起,哈哈)。

Year    Age Hair Colour
2016    12  brown
2016    13  brown
2016    15  blonde
2016    18  blonde
2016    99  black
2016    1   black
2017    34  black
2017    28  green
2017    39  blonde
2017    58  red
2017    53  red
2017    5   brown
2017    65  blonde
2018    77  grey
2018    32  black
2018    22  brown
2018    33  brown
2018    44  brown
2018    63  brown
2018    63  green
2018    29  purple
2018    96  red
2018    15  brown

【问题讨论】:

    标签: r dataframe split


    【解决方案1】:

    data.table

    library( data.table )
    
    DT <- fread("Year    Age Hair_Colour
                2016    12  brown
                2016    13  brown
                2016    15  blonde
                2016    18  blonde
                2016    99  black
                2016    1   black
                2017    34  black
                2017    28  green
                2017    39  blonde
                2017    58  red
                2017    53  red
                2017    5   brown
                2017    65  blonde
                2018    77  grey
                2018    32  black
                2018    22  brown
                2018    33  brown
                2018    44  brown
                2018    63  brown
                2018    63  green
                2018    29  purple
                2018    96  red
                2018    15  brown")
    
    dcast( DT, Year ~ Hair_Colour, value.var = "Age", fun.aggregate = mean, fill = NA )
    
    #     Year black blonde brown green grey purple  red
    # 1: 2016    50   16.5  12.5    NA   NA     NA   NA
    # 2: 2017    34   52.0   5.0    28   NA     NA 55.5
    # 3: 2018    32     NA  35.4    63   77     29 96.0
    

    【讨论】:

    • 我是 data.table 的新手。您将如何以“长”格式创建输出?
    • 非常感谢!!!!非常感谢您的帮助!
    • 你好。跟进问题-我正在尝试在条形图中绘制这些值;但是,当我尝试时,当我只想让它分隔我的 x 轴值时,年份列会显示在我的绘图中......有没有办法在不删除此代码中的分离能力的情况下删除该列?
    【解决方案2】:

    你可以使用dplyr:

    df %>%
    group_by(Year, Hair_Colour) %>%
      summarise(Age=mean(Age))
    

    返回

    # A tibble: 14 x 3
    # Groups:   Year [3]
        Year Hair_Colour   Age
       <int> <chr>       <dbl>
     1  2016 black        50  
     2  2016 blonde       16.5
     3  2016 brown        12.5
     4  2017 black        34  
     5  2017 blonde       52  
     6  2017 brown         5  
     7  2017 green        28  
     8  2017 red          55.5
     9  2018 black        32  
    10  2018 brown        35.4
    11  2018 green        63  
    12  2018 grey         77  
    13  2018 purple       29  
    14  2018 red          96  
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案3】:

    我们可以从base R使用aggregate

    aggregate(Age ~ ., df1, mean)
    #   Year HairColour  Age
    #1  2016      black 50.0
    #2  2017      black 34.0
    #3  2018      black 32.0
    #4  2016     blonde 16.5
    #5  2017     blonde 52.0
    #6  2016      brown 12.5
    #7  2017      brown  5.0
    #8  2018      brown 35.4
    #9  2017      green 28.0
    #10 2018      green 63.0
    #11 2018       grey 77.0
    #12 2018     purple 29.0
    #13 2017        red 55.5
    #14 2018        red 96.0
    

    或者如果我们需要宽格式,请使用base R中的tapply

    with(df1, tapply(Age, list(Year, HairColour), FUN = mean))
    

    数据

    df1 <- structure(list(Year = c(2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L), Age = c(12L, 
    13L, 15L, 18L, 99L, 1L, 34L, 28L, 39L, 58L, 53L, 5L, 65L, 77L, 
    32L, 22L, 33L, 44L, 63L, 63L, 29L, 96L, 15L), HairColour = c("brown", 
    "brown", "blonde", "blonde", "black", "black", "black", "green", 
    "blonde", "red", "red", "brown", "blonde", "grey", "black", "brown", 
    "brown", "brown", "brown", "green", "purple", "red", "brown")), 
    class = "data.frame", row.names = c(NA, 
    -23L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2017-01-25
      • 2020-12-30
      • 2017-12-01
      • 2020-12-18
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多