【发布时间】:2018-04-17 23:35:50
【问题描述】:
好的,这是我试图用 dplyr 实现的总体视图:
我正在使用 dplyr 进行计算以形成新列。
initial.capital -
x.long.shares -
x.end.value -
x.net.profit -
new.initial.capital
执行此操作的代码:
# Calculate Share Prices For Each ETF
# Initialize Start Capital Column
library(dplyr)
library(data.table)
df$inital.capital <- 10000
output <- df %>%
dplyr::mutate(RunID = data.table::rleid(x.long)) %>%
group_by(RunID) %>%
dplyr::mutate(x.long.shares = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
first(inital.capital) / first(close.x),0))) %>%
dplyr::mutate(x.end.value = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(x.long.shares) * last(close.x),0))) %>%
dplyr::mutate(x.net.profit = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(initial.capital) - last(x.end.value),0))) %>%
dplyr::mutate(new.initial.capital = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(x.net.profit) + last(inital.capital),0))) %>%
ungroup() %>%
select(-RunID)
我按 x.long 列分组。并且在分组时。使用组中的第一个/最后一个位置从不同的列进行计算 我的基本问题是:
在照片中,请参见 new.initial.capital 列下的红色突出显示。我如何“保存”这个值 (10185.33)... 并将其插入到 NEXT 组中,将其保存在 initial.capital 列下,再次以红色突出显示(它将替换 10,000 或将其存储在组的第一行) ?
编辑
我真正需要做的是将 new.initial.capital 列中的最终值保存到一个变量中。然后这个变量可以在下一组中使用(见下面的代码)这里的值将用作下一组计算的一部分......然后当 end new.initial.capital 更新时,然后这个值进入变量,然后它进入下一组的开头(见下面的代码)..然后所有值将再次更新..变量将被放置在这里:
output <- df %>%
dplyr::mutate(RunID = data.table::rleid(x.long)) %>%
group_by(RunID) %>%
dplyr::mutate(x.long.shares = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
first(end_of_new.initial.capital_variable_from_previous_group) / first(close.x),0))) %>%
我本质上想在 dplyr 组之间传递值。这可能吗? 或者我可以每次都将它存储在一个变量中吗?
以下是照片中的一些示例数据:保存到 .txt
df <- read.table("your_dir\df.txt",header=TRUE, sep="", stringsAsFactors=FALSE)
close.x x.long y.short x.short y.long inital.capital x.long.shares x.end.value x.net.profit new.initial.capital
37.96 NA NA NA NA 10000 NA NA NA NA
36.52 0 0 0 0 10000 0 0 0 0
38.32 0 0 0 0 10000 0 0 0 0
38.5504 0 0 0 0 10000 0 0 0 0
38.17 0 0 0 0 10000 0 0 0 0
38.85 1 1 0 0 10000 0 0 0 0
38.53 1 1 0 0 10000 0 0 0 0
39.13 1 1 0 0 10000 0 0 0 0
38.13 1 1 0 0 10000 257.4002574 9814.671815 185.3281853 10185.32819
37.01 0 0 1 1 10000 0 0 0 0
36.14 0 0 1 1 10000 0 0 0 0
35.27 0 0 1 1 10000 0 0 0 0
35.13 0 0 1 1 10000 0 0 0 0
32.2 0 0 1 1 10000 0 0 0 0
33.03 1 1 0 0 10000 0 0 0 0
34.94 1 1 0 0 10000 0 0 0 0
34.57 1 1 0 0 10000 0 0 0 0
33.6 1 1 0 0 10000 0 0 0 0
34.34 1 1 0 0 10000 302.7550711 10396.60914 -396.6091432 9603.390857
35.86 0 0 1 1 10000 0 0 0 0
我尝试了什么
我试着做一个变量:
inital.capital <- 10000
并将其插入代码中...
output <- df %>%
dplyr::mutate(RunID = data.table::rleid(x.long)) %>%
group_by(RunID) %>%
dplyr::mutate(x.long.shares = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
initial.capital / first(close.x),0))) %>% # place initial.capital variable.. initialized with 10000
dplyr::mutate(x.end.value = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(x.long.shares) * last(close.x),0))) %>%
dplyr::mutate(x.net.profit = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(initial.capital) - last(x.end.value),0))) %>%
dplyr::mutate(new.initial.capital = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
last(x.net.profit) + last(inital.capital),0))) %>%
dplyr::mutate(new.initial.capitals = ifelse(x.long == 0,0,
ifelse(row_number() == n(),
inital.capital < - last(new.initial.capital),0))) %>% # update variable with the final balance of new.inital.capital column
ungroup() %>%
select(-RunID)
如果我每次都可以更新 initial.capital 变量。这将作为组之间的“链接”。但是,这个想法目前不适用于 dplyr 设置。
任何帮助表示赞赏。
【问题讨论】:
-
您可能需要考虑尝试用一个更简单的示例重新构建您的问题。您是否可以制作一个只有少数行且不超过必要列的数据框,并尝试清晰简洁地解释应用于该数据时您的问题会是什么样子?就像现在一样,您的问题相当广泛且令人费解,这可能对这里的潜在回答者造成威慑。您可能还会发现,解释您想对数据做什么的练习将帮助您想出更多自己的解决方案。
-
我很好奇:如果
close.x的最后一个值小于第一个值,为什么x.net.profit是正数并且new.initial.capital高于initial.capital?
标签: r dplyr data.table