添加依赖于另一列和子集的列(使用tidyverse)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添加依赖于另一列和子集的列(使用tidyverse)相关的知识,希望对你有一定的参考价值。

我有以下股票数据数据集(作为tibble)

Open  Volume   Ticker
<dbl>  <dbl>    <chr>
1106.  10       AAL.L
1086.  30       AAL.L
1043.  9        ABF.L
1055.  2        ABF.L
1048.  90000    BT-A.L
1077.  8000     BT-A.L

使用dplyr包我想获得这个数据集,其中包含给定Ticker的平均音量。

Open  Volume   Ticker  AvgVolume
<dbl>  <dbl>    <chr>    <dbl>
1106.  10       AAL.L    20
1086.  30       AAL.L    20
1043.  9        ABF.L    5.5
1055.  2        ABF.L    5.5 
1048.  90000    BT-A.L   49000
1077.  8000     BT-A.L   49000

我将这样做超过500000行,因此速度和效率是关键(没有循环等...)

我是Tidyverse的新手,并希望得到答案的解释。

答案

我们按'Ticker'分组,用mean创建'AvgVolume'作为'Volume'的mutate

library(dplyr)
df1 %>%
   group_by(Ticker) %>%
   mutate(AvgVolume = mean(Volume))
# A tibble: 6 x 4
# Groups:   Ticker [3]
#   Open Volume Ticker AvgVolume
#  <int>  <int> <chr>      <dbl>
#1  1106     10 AAL.L       20  
#2  1086     30 AAL.L       20  
#3  1043      9 ABF.L        5.5
#4  1055      2 ABF.L        5.5
#5  1048  90000 BT-A.L   49000  
#6  1077   8000 BT-A.L   49000  
另一答案

虽然你要求一个整齐的解决方案并且@akrun已经发布了一个,我将发布一个基本的R方式。

这是因为你的问题是适合ave的教科书。

ave(df1$Volume, df1$Ticker)
#[1]    20.0    20.0     5.5     5.5 49000.0 49000.0

然后将此输出分配给新列。

df1$AvgVolume <- ave(df1$Volume, df1$Ticker)
df1
## A tibble: 6 x 4
#   Open Volume Ticker AvgVolume
#  <dbl>  <int> <fct>      <dbl>
#1  1106     10 AAL.L       20  
#2  1086     30 AAL.L       20  
#3  1043      9 ABF.L        5.5
#4  1055      2 ABF.L        5.5
#5  1048  90000 BT-A.L   49000  
#6  1077   8000 BT-A.L   49000

数据。

df1 <-
structure(list(Open = c(1106, 1086, 1043, 1055, 1048, 1077), 
    Volume = c(10L, 30L, 9L, 2L, 90000L, 8000L), Ticker = structure(c(1L, 
    1L, 2L, 2L, 3L, 3L), .Label = c("AAL.L", "ABF.L", "BT-A.L"
    ), class = "factor"), AvgVolume = c(20, 20, 5.5, 5.5, 49000, 
    49000)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
"data.frame"))

以上是关于添加依赖于另一列和子集的列(使用tidyverse)的主要内容,如果未能解决你的问题,请参考以下文章

datagridviewcombobox columns 依赖于另一列

Mysql 条件 MAX 或 MIN 依赖于另一列值

具有 1 个不同的列和来自另一列的总和值 [关闭]

如何使一个材料表列的编辑模式字段类型依赖于另一列的值,而不影响其他行?

比较子集和超集 CSV 的列,并在 Pandas 中输出相交列 + 超集 CSV 的另一列

使用sql更改表的列的数据类型和添加新列和约束