使用 apply() 和 If() 语句对两列求和

Using apply() and If() statement to sum() two columns

我有一个包含 2 列的 dataframe,我想在使用 apply 函数对每列中的行 sum() 时使用 if/else 条件 - 特别是,对于 Col1 >= Col2 的所有行,取 Col1sum() 并将其存储在变量 a 中,对于 Col1 < Col2 的所有行,取 [= Col1 的 16=] 并将其存储在变量 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

有3个实例Col1 >= Col2,所以在Col1中我取3+4+5的sum(),也就是12。有两个实例Col1 < Col2,所以在 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)
)

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

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

 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])

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

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