使用apply()和If()语句来sum()两列

时间:2015-03-19 02:26:05

标签: r if-statement dataframe apply calculated-columns

我有一个包含2列的dataframe,我希望在if/else函数使用apply每列中的行时使用sum()条件 - 具体来说, Col1 >= Col2sum() Col1 a并将其存储在变量Col1 < Col2中的所有行,以及sum()Col1行的所有行} b并将其存储在变量df<-data.frame(Col1=c(1,2,3,4,5),Col2=c(5,4,3,2,1)) df Col1 Col2 1 5 2 4 3 3 4 2 5 1 中。

例如

Col1 >= Col2

Col1有三个实例,所以在sum()中,我取3 + 4 + 5的Col1 < Col2,即12。有两个实例{{1} }},所以在Col1中,我取1 + 2的sum(),即3。所以

>a
12

>b
3

这是我创建的代码,但它仍在开发中:

apply(df, 1, function(x)
     if(df$Col1 >= df$Col2)
       a<-sum(df$Col1 >= df$Col2)
     else
       b<-sum(df$Col1 < df$Col2)
)

此处的代码不起作用,因为它只是添加条件为真的次数而不是实际值。

2 个答案:

答案 0 :(得分:1)

我不确定您为什么要使用-apply-解决此问题。这似乎有点矫枉过正。另请注意,您的-apply-语句缺少 margin 参数,您可以使用该参数指示是否要将函数应用于行,列或两者(同样,定义df的行需要另一个关闭的paranthesis)。 一个简单的两线解决方案就是:

 df<-data.frame(Col1=c(1,2,3,4,5),Col2=c(5,4,3,2,1)

 a <- sum(df$Col1[df$Col1 >= df$Col2])
 b <- sum(df$Col2[df$Col1 < df$Col2])

答案 1 :(得分:1)

这里真的不需要任何*apply()函数,因为它们是完全向量化的操作。以下是我可以采用的方法,将两个结果放在一个很好的列表中。

with(df, {
    x <- Col1 >= Col2
    list(a = sum(Col1[x]), b = sum(Col1[!x]))
})
# $a
# [1] 12
#
# $b
# [1] 3