通过更改参数将函数应用于数据框

时间:2015-06-04 19:40:28

标签: r apply

我有两个对象:

包含3个变量的数据框:

v1 <- 1:10
v2 <- 11:20
v3 <- 21:30
df <- data.frame(v1,v2,v3)

包含3个元素的数字向量:

nv <- c(6,11,28)

我想将第一个变量与第一个数字进行比较,将第二个变量与第二个数字进行比较,依此类推。

which(df$v1 > nv[1])
which(df$v2 > nv[2])
which(df$v3 > nv[3])

当然,实际上我的数据框有很多变量,因此手动输入每个变量都不是一个选项。

我经常遇到这些问题。我需要阅读哪些文件才能熟练掌握这些问题?

3 个答案:

答案 0 :(得分:8)

一种选择是与同等大小的元素进行比较。为此,我们可以按'df'(rep(nv, each=nrow(df)))的行数复制'nv'中的元素,并与df进行比较,或使用与col类似输出的rep函数{1}}。

 which(df > nv[col(df)], arr.ind=TRUE)

如果您需要一个逻辑矩阵,该矩阵对应于每个列与'nv'

的每个元素的比较
 sweep(df, 2, nv, FUN='>')

答案 1 :(得分:4)

您也可以使用mapply

mapply(FUN=function(x, y)which(x > y), x=df, y=nv)
#$v1
#[1]  7  8  9 10
#
#$v2
#[1]  2  3  4  5  6  7  8  9 10
#
#$v3
#[1]  9 10

答案 2 :(得分:3)

我认为这些情况很棘手,因为正常的循环解决方案(例如apply函数)只循环遍历一个对象,但你需要同时循环dfnv 。一种方法是循环索引并使用它们从dfnv中获取适当的信息。循环索引的便捷方法是sapply函数:

sapply(seq_along(nv), function(x) which(df[,x] > nv[x]))
# [[1]]
# [1]  7  8  9 10
# 
# [[2]]
# [1]  2  3  4  5  6  7  8  9 10
# 
# [[3]]
# [1]  9 10