r - 在 R DataFrame 中使用多个条件进行计算
问题描述
我有以下关于投资回报的数据集:
df <- structure(list(Date = structure(c(1620604800, 1620604800, 1620604800,
1620604800, 1620604800, 1627257600, 1627257600), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), Client = c(56203, 56203, 56203, 56203,
56203, 56203, 56203), FundName = c("SAFRA KEPLER EQUITY HEDGE FI MULTIMERCADO",
"SAFRA KEPLER FI MULTIMERCADO", "SAFRA S&P SPECIAL FIC MULTIMERCADO",
"SAFRA AÇÕES LIVRE FIC AÇÕES", "SAFRA CONSUMO AMERICANO FIC AÇÕES BDR NÍVEL I",
"SAFRA S&P SPECIAL FIC MULTIMERCADO", "SAFRA CONSUMO AMERICANO FIC AÇÕES BDR NÍVEL I"
), Nature = c("Aplicação", "Aplicação", "Aplicação", "Aplicação",
"Aplicação", "Resgate", "Resgate"), Quantity = c(145.927569,
62.684383, 16.964545, 57.852278, 14.900635, 0, 0), Value = c(21240,
12120, 8760, 9120, 8760, -9157.45, -1125), Saldo = c(21240, 12120,
8760, 9120, 8760, 55.60576570794, 9198.89221970512), FundCode = c(25079578000106,
21144577000147, 19107923000175, 32666326000149, 19436818000180,
19107923000175, 19436818000180), NAVInitialDate = c(145.551660000114,
193.349593000021, 521.980031999759, 157.489282999886, 639.441026999615,
543.077092000283, 692.849144999869), NAVYesterday = c(147.526190999895,
196.017907999922, 531.332205999643, 166.330892999889, 675.641246000305,
531.332205999643, 675.641246000305)), row.names = c(NA, -7L), class = c("tbl_df",
"tbl", "data.frame"))
df$NAVInitialDate = df$Value / df$Quantity
'NAVinitialDate' 列是每一行的“值/数量”的结果。我想对 R 说的是:“如果在一行中我们有 Quantity = 0,则 'NAVinitialDate' = ABS(Value) 除以与 FundName 相同的所有行的数量之和数量等于 0"
结果应该是,对于第 6 行 > NavInitialDate = 539,793 ;对于第 7 行 > NavInitialDate = 75,50
我怎样才能做到这一点?我想它可能需要3个条件
解决方案
我们可以在组内的所有Quantity 0 中使用 dplyr、 group_by
FundName 和NAVInitialDate。mutate
case_when
==
library(dplyr)
df%>%group_by(FundName)%>%
mutate(NAVInitialDate=case_when(Quantity==0 ~ abs(Value)/sum(Quantity, na.rm=TRUE)))
# A tibble: 7 x 10
# Groups: FundName [5]
Date Client FundName Nature Quantity Value Saldo FundCode NAVInitialDate
<dttm> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2021-05-10 00:00:00 56203 SAFRA KEPLER … Aplic… 146. 21240 2.12e4 2.51e13 NA
2 2021-05-10 00:00:00 56203 SAFRA KEPLER … Aplic… 62.7 12120 1.21e4 2.11e13 NA
3 2021-05-10 00:00:00 56203 SAFRA S&P SPE… Aplic… 17.0 8760 8.76e3 1.91e13 NA
4 2021-05-10 00:00:00 56203 SAFRA AÇÕES L… Aplic… 57.9 9120 9.12e3 3.27e13 NA
5 2021-05-10 00:00:00 56203 SAFRA CONSUMO… Aplic… 14.9 8760 8.76e3 1.94e13 NA
6 2021-07-26 00:00:00 56203 SAFRA S&P SPE… Resga… 0 -9157. 5.56e1 1.91e13 540.
7 2021-07-26 00:00:00 56203 SAFRA CONSUMO… Resga… 0 -1125 9.20e3 1.94e13 75.5
# … with 1 more variable: NAVYesterday <dbl>
推荐阅读
- angular - Angular HttpClient HttpErrorResponse JSON 中位置 0 的意外标记
- regex - 使用 vi 或 sed 的非捕获模式
- unit-testing - 当 A 的方法在 Go 中返回 B 时模拟对象 A 和 B
- docker - 当我仍然需要对地址进行硬编码时,为什么还要使用 docker 链接?
- jsf - Myfaces 2.0.5:如果没有在字段中输入值,则禁用验证
- flutter - 如何使用 Widget 控制一些导航流程
- python - Beautifulsoup - 在 soup.find() 中传递变量
- kotlin - 使用 Dagger 提供没有接口的实例
- java - 尝试使用 Dbeaver DB 连接到 Sybase 时显示“未找到合适的驱动程序”错误
- apache-spark - 带引号的字符串读取的火花数据