2

我有一个包含 4 个重要列的大型数据框 (my_DF):ID (1-->100)、YEAR (2000, 2001, 2002, 2003, 2004, 2005), MONTH (January --> December), LENGHT (continuous values)从 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 ...)。
不幸的是,我不擅长这些命令……我该怎么办?感谢您的帮助!

4

2 回答 2

2

aggregate而不是用and进行汇总merge,直接使用avefrombase R创建一列

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"))
于 2019-04-05T12:13:58.237 回答
1

您可以简单地在一行中使用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
于 2019-04-05T14:20:45.423 回答