R 基于指标的条件和

R 基于指标的条件和,r,sum,data-manipulation,R,Sum,Data Manipulation,我有这样一个数据框: A B Ind 1 10 8 1 2 9 10 2 3 7 1 2 4 19 20 1 5 . . . 如何根据Ind值对列求和?如果Ind==1,从A列求和,如果Ind==2,从B列求和。例如,前4行的输出应该是10+10+1+19=30,其中前10行在A,第二10行在B,第三1行在B,第四19行在A假设您的data.frame被称为“mydf”,您可以使用ifelse,如下所示: sum(wi

我有这样一个数据框:

   A   B   Ind
1 10   8     1
2  9  10     2
3  7   1     2
4 19  20     1
5  .   .     .

如何根据
Ind
值对列求和?如果
Ind==1
,从
A列求和
,如果
Ind==2
,从
B列求和
。例如,前4行的输出应该是
10+10+1+19=30
,其中前10行在
A
,第二10行在
B
,第三1行在
B
,第四19行在
A
假设您的data.frame被称为“mydf”,您可以使用
ifelse
,如下所示:

sum(with(mydf, ifelse(Ind == 1, A, B)))
以下是
ifelse
部分的结果:

> with(mydf, ifelse(Ind == 1, A, B))
[1] 10 10  1 19
当然,如果您有多个条件,可以根据需要嵌套它们


下面是一个使用基本子集的更详细的替代方案:

sum(with(mydf, c(mydf[Ind == 1, "A"], mydf[Ind == 2, "B"])))

使用
I

 sum(with(dat,A*I(Ind==1)+B*(Ind==2)))

使用
的解决方案,其中

sum( df$A[which(df$Ind==1)] , df$B[which(df$Ind==2)] )

我知道这可以通过for循环+if语句实现。有什么方法可以快速做到这一点吗?
I
的有趣用法。我在这里是不会想到的+1最后一行不完全返回。如果您通过以下行生成数据:
mydf@Boxuan,您不会在任何地方提到值的显示顺序是重要的,而且据我在数学课上回忆,它不适用于加法。您肯定是对的。顺序并不重要。我只是好奇为什么
with
函数不按顺序返回行。@Boxuan,你应该看的不是
with
函数。所有三种建议都使用
with
纯粹是为了方便起见,不必重复键入
data.frame
名称。我展示的第二个选项基本上是将两个子集附加在一起,这就是为什么不保留顺序的原因。agstudy的解决方案将两个向量相加,其中每个向量中的几个值都将为零,
ifelse
逐行向下移动
data.frame
。因此,
ifelse
I
解决方案将保留行顺序,但子集版本不会。