我有一个包含2列的dataframe
,我希望在if/else
函数使用apply
每列中的行时使用sum()
条件 - 具体来说, Col1 >= Col2
取sum()
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)
)
此处的代码不起作用,因为它只是添加条件为真的次数而不是实际值。
答案 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