R 处于ifelse状态的sumif

R 处于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),则为收入百分比计算,在这种情况下为可赚

我有一个具有多列的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   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