R:在循环中的条件下取行总和
R : Taking sum of row on a condition in a loop
我有一个看起来有点像这样的数据框:
inter_cv_vars <- data.frame(
I_Org_ZB1 = rep(0:1,each = 2, len = 20),
I_Org_ZB2 = rep(0:1,each = 1, len = 20),
I_Org_ZB3 = rep(0:1,each = 3, len = 20),
I_Org_ZB4 = rep(0:1,each = 4, len = 20),
I_Org_ZB5 = rep(0:1,each = 5, len = 20),
I_Org_ZB6 = rep(0:1,each = 1, len = 20),
I_Org_ZB7 = rep(0:1,each = 3, len = 20),
I_Org_ZB8 = rep(0:1,each = 2, len = 20),
I_Org_ZB9 = rep(0:1,each = 4, len = 20),
I_Org_ZB10 = rep(0:1,each = 6, len = 20),
I_Org_ZB11 = rep(0:1,each = 2, len = 20),
I_Org_ZB12 = rep(0:1,each = 1, len = 20))
我想根据以下条件在此数据框中创建一个新列“O_ZERO_BILLING_CNT_TRL_Y1
”:
从“I_Org_ZB1
”列开始的连续“1”值的总和,如果序列中断则“O_ZERO_BILLING_CNT_TRL_Y1
”列的值将是序列,直到连续“ 1" 值出现。
例如:- 如果 I_Org_ZB1 I_Org_ZB2 I_Org_ZB3
的值为 1,1,1 n 每隔一个值为零,则“O_ZERO_BILLING_CNT_TRL_Y1
”列的值将为 3,但如果值为 1,0 ,1 & 每隔一列为 0,则“O_ZERO_BILLING_CNT_TRL_Y1
”的值将为 1。如果在特定行中,所有值均为 1,则列的值将为 12。
我试过下面的代码:
for (i in 1:12){
if(i == 12)
{next}
ifelse(inter_cv_vars$I_Org_ZB1 == 1,
inter_cv_vars$O_ZERO_BILLING_CNT_TRL_Y1 <- ifelse(
rowSums(inter_cv_vars[,1:eval(parse(text=sprintf("(12-%s+1)",i)))]) == eval(parse(text=sprintf("(12-%s+1)",i))),
eval(parse(text=sprintf("(12-%s+1)",i))),0),
0)
}
但是得到了一个错误的答案,谁能指出我犯的错误或提供任何其他选择。
在此先感谢您的帮助:)
此致,
阿米特
这还远未优化,但如果我有你需要的,它应该可以工作:
apply(inter_cv_vars,1,function(x) max(cumsum(x)*cumprod(x)))
#[1] 0 0 1 3 0 0 1 2 0 0 1 3 0 0 1 9 0 0 1 2
我有一个看起来有点像这样的数据框:
inter_cv_vars <- data.frame(
I_Org_ZB1 = rep(0:1,each = 2, len = 20),
I_Org_ZB2 = rep(0:1,each = 1, len = 20),
I_Org_ZB3 = rep(0:1,each = 3, len = 20),
I_Org_ZB4 = rep(0:1,each = 4, len = 20),
I_Org_ZB5 = rep(0:1,each = 5, len = 20),
I_Org_ZB6 = rep(0:1,each = 1, len = 20),
I_Org_ZB7 = rep(0:1,each = 3, len = 20),
I_Org_ZB8 = rep(0:1,each = 2, len = 20),
I_Org_ZB9 = rep(0:1,each = 4, len = 20),
I_Org_ZB10 = rep(0:1,each = 6, len = 20),
I_Org_ZB11 = rep(0:1,each = 2, len = 20),
I_Org_ZB12 = rep(0:1,each = 1, len = 20))
我想根据以下条件在此数据框中创建一个新列“O_ZERO_BILLING_CNT_TRL_Y1
”:
从“I_Org_ZB1
”列开始的连续“1”值的总和,如果序列中断则“O_ZERO_BILLING_CNT_TRL_Y1
”列的值将是序列,直到连续“ 1" 值出现。
例如:- 如果 I_Org_ZB1 I_Org_ZB2 I_Org_ZB3
的值为 1,1,1 n 每隔一个值为零,则“O_ZERO_BILLING_CNT_TRL_Y1
”列的值将为 3,但如果值为 1,0 ,1 & 每隔一列为 0,则“O_ZERO_BILLING_CNT_TRL_Y1
”的值将为 1。如果在特定行中,所有值均为 1,则列的值将为 12。
我试过下面的代码:
for (i in 1:12){
if(i == 12)
{next}
ifelse(inter_cv_vars$I_Org_ZB1 == 1,
inter_cv_vars$O_ZERO_BILLING_CNT_TRL_Y1 <- ifelse(
rowSums(inter_cv_vars[,1:eval(parse(text=sprintf("(12-%s+1)",i)))]) == eval(parse(text=sprintf("(12-%s+1)",i))),
eval(parse(text=sprintf("(12-%s+1)",i))),0),
0)
}
但是得到了一个错误的答案,谁能指出我犯的错误或提供任何其他选择。
在此先感谢您的帮助:)
此致,
阿米特
这还远未优化,但如果我有你需要的,它应该可以工作:
apply(inter_cv_vars,1,function(x) max(cumsum(x)*cumprod(x)))
#[1] 0 0 1 3 0 0 1 2 0 0 1 3 0 0 1 9 0 0 1 2