R 处于ifelse状态的sumif
我有一个具有多列的DT,我需要在ifelse中给出一个条件,并相应地进行计算。我希望它按段分组进行计数/求和(count)。这是DTR 处于ifelse状态的sumif,r,if-statement,data.table,R,If Statement,Data.table,我有一个具有多列的DT,我需要在ifelse中给出一个条件,并相应地进行计算。我希望它按段分组进行计数/求和(count)。这是DT Segment Count Flag A 23 Y B 45 N A 56 N B 212 Y 我想要第四列作为基于标志的段的总计数的计数,所以输出应该是这样的。对于标志N,它是每个段的计数份额。对于标志Y,如果否(N)变为是(Y),则为收入百分比计算,在这种情况下为可赚
Segment Count Flag
A 23 Y
B 45 N
A 56 N
B 212 Y
我想要第四列作为基于标志的段的总计数的计数,所以输出应该是这样的。对于标志N,它是每个段的计数份额。对于标志Y,如果否(N)变为是(Y),则为收入百分比计算,在这种情况下为可赚取的收入。我很抱歉,因为这是笨拙的,但请在评论中问我,如果你有任何疑问
Segment Count Flag Rev Value
A 23 Y 34 ((56/23)*34)/(34+69)
B 45 N 48 45/(45+212)
A 56 N 23 56/(56+23)
B 212 Y 67 ((45/212)*67)/(67+12)
A 65 Y 69 ...
B 10 Y 12 ...
感谢您的帮助。谢谢 我们可以使用
data.table
执行此操作。将'data.frame'转换为'data.table'(setDT(DT)
),按'Segment'分组,通过将'Count'除以'Count'的总和来创建'Value'列,然后更新标志'N'处的'Value'
library(data.table)
setDT(DT)[, Value := Count/sum(Count), Segment
][Flag == "N", Value := Count/sum(Count), Segment]
DT
# Segment Count Flag Value
#1: A 23 Y 0.18852459
#2: B 45 N 1.00000000
#3: A 56 N 1.00000000
#4: B 212 Y 0.78810409
#5: A 43 Y 0.35245902
#6: B 12 Y 0.04460967
只需检查OPs预期输出“值”
> 23/122
#[1] 0.1885246
> 212/269
#[1] 0.7881041
> 43/122
#[1] 0.352459
> 12/269
#[1] 0.04460967
更新3
根据Op发布的第3次更新
s1 <- setDT(DT1)[, .(rn = .I[Flag == "Y"], Value = (Rev[Flag=="Y"] *
(Count[Flag == "N"]/Count[Flag=="Y"]))/sum(Rev[Flag == "Y"])), Segment]
s2 <- DT1[, .(rn = .I[Flag == "N"], Value = Count[Flag == "N"]/(Count[Flag == "N"] +
Count[Flag=="Y"][1])), Segment]
DT1[, Value := rbind(s1, s2)[order(rn)]$Value]
DT1
# Segment Count Flag Rev Value
#1: A 23 Y 34 0.8037146
#2: B 45 N 48 0.1750973
#3: A 56 N 23 0.7088608
#4: B 212 Y 67 0.1800215
#5: A 65 Y 69 0.5771471
#6: B 10 Y 12 0.6835443
>((56/23)*34)/(34+69)
#[1] 0.8037146
> 45/(45+212)
#[1] 0.1750973
> 56/(56+23)
#[1] 0.7088608
> ((45/212)*67)/(67+12)
#[1] 0.1800215
s145/(45+212)
#[1] 0.1750973
> 56/(56+23)
#[1] 0.7088608
> ((45/212)*67)/(67+12)
#[1] 0.1800215
数据
DT我们可以用data.table
实现这一点。将'data.frame'转换为'data.table'(setDT(DT)
),按'Segment'分组,通过将'Count'除以'Count'的总和来创建'Value'列,然后更新标志'N'处的'Value'
library(data.table)
setDT(DT)[, Value := Count/sum(Count), Segment
][Flag == "N", Value := Count/sum(Count), Segment]
DT
# Segment Count Flag Value
#1: A 23 Y 0.18852459
#2: B 45 N 1.00000000
#3: A 56 N 1.00000000
#4: B 212 Y 0.78810409
#5: A 43 Y 0.35245902
#6: B 12 Y 0.04460967
只需检查OPs预期输出“值”
> 23/122
#[1] 0.1885246
> 212/269
#[1] 0.7881041
> 43/122
#[1] 0.352459
> 12/269
#[1] 0.04460967
更新3
根据Op发布的第3次更新
s1 <- setDT(DT1)[, .(rn = .I[Flag == "Y"], Value = (Rev[Flag=="Y"] *
(Count[Flag == "N"]/Count[Flag=="Y"]))/sum(Rev[Flag == "Y"])), Segment]
s2 <- DT1[, .(rn = .I[Flag == "N"], Value = Count[Flag == "N"]/(Count[Flag == "N"] +
Count[Flag=="Y"][1])), Segment]
DT1[, Value := rbind(s1, s2)[order(rn)]$Value]
DT1
# Segment Count Flag Rev Value
#1: A 23 Y 34 0.8037146
#2: B 45 N 48 0.1750973
#3: A 56 N 23 0.7088608
#4: B 212 Y 67 0.1800215
#5: A 65 Y 69 0.5771471
#6: B 10 Y 12 0.6835443
>((56/23)*34)/(34+69)
#[1] 0.8037146
> 45/(45+212)
#[1] 0.1750973
> 56/(56+23)
#[1] 0.7088608
> ((45/212)*67)/(67+12)
#[1] 0.1800215
s145/(45+212)
#[1] 0.1750973
> 56/(56+23)
#[1] 0.7088608
> ((45/212)*67)/(67+12)
#[1] 0.1800215
数据
DT或者,我们也可以使用dplyr
pkg来实现
根据@Aramis7d提供的建议进行更新-谢谢
library(data.table)
df <- fread("Segment Count Flag
A 23 Y
B 45 N
A 56 N
B 212 Y
A 43 Y
B 12 Y")
library(dplyr)
df %>%
group_by(Segment) %>%
mutate(Value = Count/sum(Count)) %>%
group_by(Segment, Flag) %>%
mutate(Value = if_else( Flag == "N", Count/sum(Count), Value))
库(data.table)
df%
分组单位(分部)%>%
变异(值=计数/总和(计数))%>%
分组依据(分段、标志)%>%
变异(值=if_else(标志=“N”,计数/总和(计数),值))
或者,我们也可以使用dplyr
pkg来实现
根据@Aramis7d提供的建议进行更新-谢谢
library(data.table)
df <- fread("Segment Count Flag
A 23 Y
B 45 N
A 56 N
B 212 Y
A 43 Y
B 12 Y")
library(dplyr)
df %>%
group_by(Segment) %>%
mutate(Value = Count/sum(Count)) %>%
group_by(Segment, Flag) %>%
mutate(Value = if_else( Flag == "N", Count/sum(Count), Value))
库(data.table)
df%
分组单位(分部)%>%
变异(值=计数/总和(计数))%>%
分组依据(分段、标志)%>%
变异(值=if_else(标志=“N”,计数/总和(计数),值))
您好,请问是什么setDT@AbhishekSingh这是一个将“data.frame”转换为“data.table”的函数@AbhishekSingh好的,那么就不需要应用setDT
我很抱歉造成混淆,但它必须根据第二个选项中的标志来做,第一个条件是它应该将所有内容相加,而不管标志是什么。在这种情况下,该怎么办。编辑问题。@AbhishekSingh是的,它是根据第二列中的标志完成的。请检查i
条件,即Flag==“Y”
Hi,是什么setDT@AbhishekSingh这是一个将“data.frame”转换为“data.table”的函数@AbhishekSingh好的,那么就不需要应用setDT
我很抱歉造成混淆,但它必须根据第二个选项中的标志来做,对于第一个条件,它应该将所有内容相加,而不考虑标志。在这种情况下,该怎么办。编辑问题。@AbhishekSingh是的,它是根据第二列中的标志完成的。请检查i
条件,即Flag==“Y”
确保按照OP的要求生成正确的输出?我阅读了第一稿,而不是后来编辑的一稿:-),但您完成了其余部分。。。不管怎么说,它看起来很简单,满足了您刚才所做的要求……似乎OP还没有决定anyway@ManojKumar这对我不起作用,或者我不知道如何使用它。你可以更努力地笑,来吧,兄弟。我们的评论中没有讽刺。我们都在尽力帮助你。。别以为这样…确定这会按照OP的要求产生正确的输出吗?我读了初稿,而不是后来编辑的:-)但你做了其余部分。。。不管怎么说,它看起来很简单,满足了您刚才所做的要求……似乎OP还没有决定anyway@ManojKumar这对我没用,或者我不知道怎么用。你可以更努力地笑,来吧,兄弟。我们的评论中没有讽刺。我们都在尽力帮助你。。别以为这样…这是什么?您已经第三次更改了预期输出。对不起,请珍惜别人的时间。随着数据的不断增加,我知道了需要什么。很抱歉浪费了你的时间,但这并没有白费。现在我知道该怎么做了。非常感谢@AbhishekSingh请参考指南,感谢您对Arun的讽刺和帮助。但是它被留下了,因为它不在乎有什么值。好吧,伙计,我在这里迷路了b45n4845/(45+212);56 N 23 56/(56+23)
这两个212和23对于“N”有什么不同,或者说每个元素都有特定的规则。我的问题是为什么不包括65
这是什么?您已经第三次更改了预期输出。对不起,请珍惜别人的时间。随着数据的不断增加,我知道了需要什么。很抱歉浪费了你的时间,但这并没有白费。现在我知道该怎么做了。非常感谢@AbhishekSingh请参考指南,感谢您对Arun的讽刺和帮助。但是它被留下了,因为它不在乎有什么值。好吧,伙计,我在这里迷路了b45n4845/(45+212);56 N 23 56/(56+23)
这两个212和23对于“N”有什么不同,或者说每个元素都有特定的规则。我的问题是为什么不包括65