当超过阈值时,如何使用cumsum返回索引?
v <- c(1,5,7,9,10,14,16,17)
Threshold <- 10
Run Code Online (Sandbox Code Playgroud)
该函数将返回3,因为累积和将仅大于10,这提供了e索引3作为结果.
这是继前一个问题一个.在该问题中,建议用于rollapply计算1st, 2nd, 3rd向量条目的总和; 然后2nd, 3rd, 4th,等等.
我的问题是如何计算总和1st, 2nd and 3rd; 那么4th, 5th and 6th.也就是说,滚动没有重叠.这可以轻松完成吗?
我正在清理一些眼动追踪数据,正如预期的那样,它是凌乱的.我坚持一个初步的步骤,我会尽力描述.解决方案可能非常简单.
我有两个变量,一个是二元(x1),另一个是连续的(x2),例如:
dat <- data.frame(x1 = c(0,1,1,0,1,1,1,0,1,1),
x2 = c(22,23,44,25,36,37,28,19,30,41))
Run Code Online (Sandbox Code Playgroud)
我需要创建一个新的变量(x3),它是x2的累积和,仅适用于x1等于1的连续情况.最终产品看起来像这样:
dat <- data.frame(x1 = c(0,1,1,0,1,1,1,0,1,1),
x2 = c(22,23,44,25,36,37,28,19,30,41),
x3 = c(0, 23, 67, 0, 36, 73, 101, 0, 30, 71))
Run Code Online (Sandbox Code Playgroud)
换句话说,这是一个cumsum()的x2每个0后"复位" x1.
我有一个稀疏的数据框,包括购买或出售库存的日期,如下所示:
Date Inventory
2017-01-01 10
2017-01-05 -5
2017-01-07 15
2017-01-09 -20
Run Code Online (Sandbox Code Playgroud)
我想解决的第一步是添加其他日期。我知道您可以使用重新采样,但只需突出显示这部分,以防它对下一个更困难的部分产生影响。如下:
Date Inventory
2017-01-01 10
2017-01-02 NaN
2017-01-03 NaN
2017-01-04 NaN
2017-01-05 -5
2017-01-06 NaN
2017-01-07 15
2017-01-08 NaN
2017-01-09 -20
Run Code Online (Sandbox Code Playgroud)
最后一步是让它向前填充 NaN,除非它遇到一个新值,该值会添加到上面行的当前值中,以便最终的数据帧如下所示:
Date Inventory
2017-01-01 10
2017-01-02 10
2017-01-03 10
2017-01-04 10
2017-01-05 5
2017-01-06 5
2017-01-07 20
2017-01-08 20
2017-01-09 0
2017-01-10 0
Run Code Online (Sandbox Code Playgroud)
我正在尝试采用 pythonic 方法来解决此问题,而不是基于循环的方法,因为那样会非常慢。
该示例也适用于具有多列的表,如下所示:
Date InventoryA InventoryB
2017-01-01 10 NaN
2017-01-02 NaN NaN
2017-01-03 NaN 5
2017-01-04 NaN 5
2017-01-05 -5 NaN
2017-01-06 NaN …Run Code Online (Sandbox Code Playgroud) 样本数据
dat <- data.frame(year = as.factor(rep(c(2012:2015),each = 6)),id.2wk = rep(c(18,19,20,21,22,23),times = 4),
value = c(1.8,15.6,32.9,27.5,19.6,2.6,1,8,42,35,11,3,2,7,12,47,26,7,2,13,24,46,12,4))
with(dat, plot(id.2wk[year == 2012], cumsum(value[year == 2012]), type = "b"))
with(dat, points(id.2wk[year == 2013], cumsum(value[year == 2013]), type = "b"))
with(dat, points(id.2wk[year == 2014], cumsum(value[year == 2014]), type = "b"))
with(dat, points(id.2wk[year == 2015], cumsum(value[year == 2015]), type = "b"))
Run Code Online (Sandbox Code Playgroud)
我想使用 ggplot2 创建相同的图。我这样做了:
ggplot(dat, aes(x = id.2wk, y = cumsum(value), colour = factor(year))) +
geom_line(size = 1)+
geom_point()
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
我需要创建“连胜”专栏。例如,我有如下数据。具有最大值的列是获胜者。
AA BB CC
5.95 5.95 0
0 -2.35 2.35
-0.6 -0.6 -0.6
-2.35 2.35 0
-1.6 1.6 -1.6
-1.25 1.25 1.25
1.85 0 -1.85
1.3 0 -1.3
-1.7 1.7 -1.7
0 0.25 0.25
Run Code Online (Sandbox Code Playgroud)
并需要创建“连胜;连续获胜多少次”列,如下所示。
AA BB CC CW_AA CW_BB CW_CC
5.95 5.95 0 1 1 0
0 -2.35 2.35 0 0 1
-0.6 -0.6 -0.6 1 1 2
-2.35 2.35 0 0 2 0
-1.6 1.6 -1.6 0 3 0
-1.25 1.25 1.25 0 4 1
1.85 0 -1.85 …Run Code Online (Sandbox Code Playgroud) 我有一个包含2列的数据框,这里的目标很简单; 如果行列设置为False,则重置df.cumsum();
DF
value condition
0 1 1
1 2 1
2 3 1
3 4 0
4 5 1
Run Code Online (Sandbox Code Playgroud)
想要的结果如下:
DF
value condition
0 1 1
1 3 1
2 6 1
3 4 0
4 9 1
Run Code Online (Sandbox Code Playgroud)
如果我循环数据帧,如本文所述Python pandas cumsum()重置后达到最大值 我可以实现想要的结果,但我正在寻找一个更加矢量化的方式使用pandas标准函数
x <- seq(1:100)
y <- 30
Run Code Online (Sandbox Code Playgroud)
如果我想确定x> y的累积和的位置
which.max(cumsum(x) >= y)
[1] 9 #
Run Code Online (Sandbox Code Playgroud)
相反,如果y是一个向量,即我想为y的每个元素返回x的位置
y <- c(30, 60, 80, 90)
which.max(cumsum(x) >= y)
[1] 9
Run Code Online (Sandbox Code Playgroud)
为什么不重新调整位置向量?
所以我现在有一个看起来像这样的表:
data_wrong <- data.table(State = c("NY", "NY", "NY", "NY", "PA", "PA", "PA",
"NJ", "NJ", "NJ"), Year = c("1973", "1974", "1975", "2005", "1992", "1993",
"2001", "1930", "1931", "1932"), Consecutive_Yrs = c(1,2,3,1,1,6,1,1,9,10))
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样:
data <- data.table(State = c("NY", "NY", "NY", "NY", "PA", "PA", "PA", "NJ",
"NJ", "NJ"), Year = c("1973", "1974", "1975", "2005", "1992", "1993",
"2001", "1930", "1931", "1932"), Consecutive_Yrs = c(1,2,3,1,1,2,1,1,2,3))
Run Code Online (Sandbox Code Playgroud)
这是我现在用来获取我的表的代码:
data$diff <- NA
data <- data %>%
group_by(State) %>%
arrange(State) %>%
mutate(diff = Year - lag(Year, default = first(Year))) …Run Code Online (Sandbox Code Playgroud) 我有一系列治疗,每天一次(二进制),比如:
trt <- c(0, 0, 1, 0, 0, 0, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)
我想创建一个向量days_since,即:
trt是 1所以,输出days_since应该是:
days_since <- c(NA, NA, 0, 1, 2, 3, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)
我将如何在 R 中做到这一点?为了得到days_since,我基本上需要滞后一个元素并加 1,但每次原始向量 ( trt) 为 1时都重置。如果这在没有 for 循环的情况下可行,那将是理想的,但不是绝对必要的。
我写了一个涉及cumsum符号向量的小八度脚本,我希望它可以工作,但不幸的是,它没有。这是代码:
pkg load symbolic
n = 3;
syms q x
q = sym('q', [n 1]);
x = sym('x', [n 1]);
cumsum(q - x)
Run Code Online (Sandbox Code Playgroud)
我得到的不是预期的结果:
错误:cumsum:错误的类型参数“类”
为什么会发生这种情况?它可以与 Matlab Symbolic Toolbox 一起使用吗?(不幸的是,我没有它,所以我无法测试。)
所以我有一个系列,我想要 cumsum,但每次我达到 0 时都重新开始,如下所示:
| 原始 | 想要的结果 | |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 1 | 4 |
| 5 | 1 | 5 |
| 6 | 1 | 6 |
| 7 | 0 | 0 |
| 8 | 1 | 1 |
| 9 | 1 | 2 |
| 10 | 1 | 3 |
| 11 | 0 | 0 |
| 12 | 1 | 1 |
| 13 | 1 | 2 |
| 14 | 1 | 3 |
| 15 | 1 | 4 |
| 16 | 1 | 5 |
| 17 号 | 1 | 6 |
有任何想法吗?(熊猫、纯蟒蛇、其他)
我创建了以下可重现的示例:
library(data.table)
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A" )
Col_3 <- 1000
Col_4 <- ""
data <- data.frame( Col_1, Col_2, Col_3, Col_4 )
mydata.table <- as.data.table( data )[ , list( Col_1, Col_2, Col_3, Col_4 ) ]
Col1 <- "Col_1"; Col2 <- "Col_2"; Col3 <- "Col_3"; Col4 <- "Col_4"
mydata.table[, (Col4) := ifelse( get( Col2 ) == "A" , get( Col1 ) * get( Col3 ), "0" ) ]
mydata.table[ , …Run Code Online (Sandbox Code Playgroud)