将函数应用于具有更改参数的数据框
Apply function to dataframe with changing argument
我有 2 个对象:
具有 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])
当然,实际上我的数据框有更多变量,因此无法手动输入每个变量。
我经常遇到这类问题。我需要阅读什么样的文档才能熟练掌握这些问题?
一种选择是与大小相同的元素进行比较。为此,我们可以通过 'df' (rep(nv, each=nrow(df))
) 的行数复制 'nv' 中的每个元素,并与 df
进行比较或使用 col
函数与 rep
类似的输出。
which(df > nv[col(df)], arr.ind=TRUE)
如果你需要一个逻辑矩阵对应于每列与'nv'
的每个元素的比较
sweep(df, 2, nv, FUN='>')
我认为这种情况很棘手,因为正常的循环解决方案(例如 apply
函数)只循环一个对象,但你需要循环遍历 df
和 nv
同时。一种方法是遍历索引并使用它们从 df
和 nv
中获取适当的信息。循环遍历索引的一种便捷方法是 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
您也可以使用 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 个变量的数据框:
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])
当然,实际上我的数据框有更多变量,因此无法手动输入每个变量。
我经常遇到这类问题。我需要阅读什么样的文档才能熟练掌握这些问题?
一种选择是与大小相同的元素进行比较。为此,我们可以通过 'df' (rep(nv, each=nrow(df))
) 的行数复制 'nv' 中的每个元素,并与 df
进行比较或使用 col
函数与 rep
类似的输出。
which(df > nv[col(df)], arr.ind=TRUE)
如果你需要一个逻辑矩阵对应于每列与'nv'
的每个元素的比较 sweep(df, 2, nv, FUN='>')
我认为这种情况很棘手,因为正常的循环解决方案(例如 apply
函数)只循环一个对象,但你需要循环遍历 df
和 nv
同时。一种方法是遍历索引并使用它们从 df
和 nv
中获取适当的信息。循环遍历索引的一种便捷方法是 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
您也可以使用 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