使用 apply() 和 If() 语句对两列求和
Using apply() and If() statement to sum() two columns
我有一个包含 2 列的 dataframe
,我想在使用 apply
函数对每列中的行 sum()
时使用 if/else
条件 - 特别是,对于 Col1 >= Col2
的所有行,取 Col1
的 sum()
并将其存储在变量 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
我有一个包含 2 列的 dataframe
,我想在使用 apply
函数对每列中的行 sum()
时使用 if/else
条件 - 特别是,对于 Col1 >= Col2
的所有行,取 Col1
的 sum()
并将其存储在变量 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