【问题标题】:How to paste values between two dataframes when conditions are respected尊重条件时如何在两个数据框之间粘贴值
【发布时间】:2019-08-27 08:09:32
【问题描述】:

我有一个包含 4 个重要列的大型数据框 (my_DF):ID (1-->100)、YEAR (2000, 2001, 2002, 2003, 2004, 2005), MONTH (January --> December), LENGHT (从 0.1 到 1.0 的连续值)。 比如:

        YEAR      MONTH       ID   LENGHT 
1       2000     january      S1   0.2 
2       2000     january      S1   0.3
3       2000     january      S1   0.1 
4       2000     january      S2   0.5
5       2000     january      S2   0.3 
6       2000     february     S1   0.9
7       2000     february     S1   0.4 
8       2000     february     S1   0.6 
9       2000     february     S3   0.4
10      2000     february     S3   0.3 
11      2000     march        S1   0.7 
...

我需要向数据框添加一个新列,填充每个独特情况的中值长度,因此对于每个 ID、YEAR 和 MONTH 值。

感谢聚合,我成功获得了我正在寻找的值:

agg <- aggregate(my_DF["LENGHT"], by = list(my_DF$YEAR, my_DF$MONTH, my_DF$ID), median)

通过这种方式我获得了我想要的值,但是,当然,这只是创建一个新的数据框。 我没有找到一种快速的方法将数据框“agg”的值粘贴到数据框“my_DF”的新列中,基于 YEAR、MONTH 和 ID 对应关系。

例如,我想获得类似的东西:

        YEAR     MONTH       ID   LENGHT   MONTHLY_LENGHT_MEDIAN
1       2000     january      S1   0.2           0.2
2       2000     january      S1   0.3           0.2
3       2000     january      S1   0.1           0.2
4       2000     january      S2   0.5           0.4
5       2000     january      S2   0.3           0.4
6       2000     february     S1   0.9           0.6
7       2000     february     S1   0.4           0.6
8       2000     february     S1   0.6           0.6
9       2000     february     S3   0.4           0.35
10      2000     february     S3   0.3           0.35
11      2000     march        S1   0.7           0.7

所以,我想知道条件命令是否适合我的情况(如果,ifelse...)。
不幸的是,我不擅长这些命令……我该怎么办? 感谢您的帮助!

【问题讨论】:

    标签: r dataframe if-statement paste


    【解决方案1】:

    不要用aggregate总结,然后merge,直接用base R中的ave创建列

    my_df$MONTHLY_LENGHT_MEDIAN <- with(my_df, ave(LENGHT, YEAR,
                      MONTH, ID, FUN = median))
    mydf$MONTHLY_LENGHT_MEDIAN
    #[1] 0.20 0.20 0.20 0.40 0.40 0.60 0.60 0.60 0.35 0.35
    

    或tidyverse

    library(tidyverse)
    my_df %>%
          group_by(LENGHT, YEAR, MONTH) %>%
          mutate(MONTHLY_LENGHT_MEDIAN = median(LENGHT))
    

    数据

    my_df <- structure(list(YEAR = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
    2000L, 2000L, 2000L, 2000L), MONTH = c("january", "january", 
    "january", "january", "january", "february", "february", "february", 
    "february", "february"), ID = c("S1", "S1", "S1", "S2", "S2", 
    "S1", "S1", "S1", "S3", "S3"), LENGHT = c(0.2, 0.3, 0.1, 0.5, 
    0.3, 0.9, 0.4, 0.6, 0.4, 0.3)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10"))
    

    【讨论】:

      【解决方案2】:

      您可以使用data.table 简单地在一行中完成此操作

      library(data.table)
      setDT(dt)[ , median := median(LENGHT), by = .(YEAR,MONTH,ID)]
      
      > dt
          YEAR    MONTH ID LENGHT mean median
       1: 2000  january S1    0.2 0.20   0.20
       2: 2000  january S1    0.3 0.20   0.20
       3: 2000  january S1    0.1 0.20   0.20
       4: 2000  january S2    0.5 0.40   0.40
       5: 2000  january S2    0.3 0.40   0.40
       6: 2000 february S1    0.9 0.60   0.60
       7: 2000 february S1    0.4 0.60   0.60
       8: 2000 february S1    0.6 0.60   0.60
       9: 2000 february S3    0.4 0.35   0.35
      10: 2000 february S3    0.3 0.35   0.35
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 2020-12-09
        • 2019-06-11
        • 2012-11-23
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多