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
解决方案将保留行顺序,但子集版本不会。