apply()函数不适用于单独的行

时间:2019-05-26 12:36:01

标签: r dataframe matrix apply

我编写了一个函数,用于从大矩阵(“ c.mat”)中为data.frame(“ df.1”)中的每一行提取数据。 data.frame中有一个索引行(“ df.1 $ hour”),它对应于矩阵中的相关列。矩阵和data.frame之间的行数相等,因此该函数可以运行:

assignUV.FUN <- function(df, mat){
  num=df$hour
  value = mat[as.numeric(rownames(df)),num]
  return(value)
}

非常简单。但是,当使用apply对每一行运行此操作时:

df.1 <- data.frame(hour= round(runif(10,1,100)), x = seq(1,10, length=10))
c.mat <- matrix(runif(1000,1,5), nrow=10)

try <- apply(df.1, 1, assignUV.FUN, mat = c.mat, df=df.1)

我得到了错误:

Error in FUN(newX[, i], ...) : unused argument (newX[, i])

我确定这里存在冲突,因此我要两次调用data.frame,一次是在assignUV.FUN函数内部,一次是使用apply,但我无法弄清楚为什么会赢不行

有什么想法吗?如果我只在一行上运行,它就可以正常工作:

assignUV.FUN(df = df.1[1,], mat=c.mat)

2 个答案:

答案 0 :(得分:3)

如果我对您的理解正确,则希望根据 const articleData = [ { _id: "6ce9bae00000000000000000", name: "article-1", category: "5ce9acd00000000000000000" } ]; const categoryData = [ { _id: "5ce9acd00000000000000000", name: "category-1" } ]; const x = await Article.insertOrUpdate({ data: articleData }); const y = await Category.insertOrUpdate({ data: categoryData }); const a = Article.query() .with("category") .first(); console.log({ a }); console.log({ type: a.category }); console.log("why a.category is null???"); 列中的值为c.mat中的每一行子集df.1。我不认为hour是这里的最佳选择,因为您想同时按行和列索引对其进行子集化。 apply传递行的值,而不是子集所需的索引。 apply系列的一种选择是使用apply

mapply

否则将采用向量化方法

mapply(function(x, y) c.mat[x, y], seq_len(nrow(df.1)), df.1$hour)
#[1] 2.472 3.980 3.654 4.868 4.204 3.320 4.191 3.296 1.016 4.353

要详细了解为什么当您单独申请一行而不是使用c.mat[cbind(1:nrow(df.1), df.1$hour)] #[1] 2.472 3.980 3.654 4.868 4.204 3.320 4.191 3.296 1.016 4.353 时它起作用,请注意,当您对一行进行子集化时,它仍然是带有标题的一行数据框。

apply

因此,当您在df.1[1, ] # hour x #1 31 1 class(df.1[1, ]) #[1] "data.frame" 函数中执行df$hour时,您将获得一个值

assignUV.FUN

但是,df.1[1, ]$hour #[1] 31 并非如此

apply

,如果您尝试提取值

apply(df.1[1, ], 1, class)
#        1 
#"numeric" 
  

x $ hour中的错误:$运算符对于原子向量无效

您可以通过使用位置而不是姓名来解决上述问题

apply(df.1[1, ], 1, function(x) x$hour)

但是这使您从apply(df.1[1, ], 1, function(x) x[1]) #31 的列到子集而不是行。

数据

c.mat

答案 1 :(得分:1)

Ronak的矢量方法是可行的方法,但是我希望这可以为您提供指导。 apply不会将data.frame传递给FUN,而是传递矢量,因此您可以尝试

assignUV.FUN <- function(DF, mat){
  num=DF[1]
  value = mat[DF[2],num]
  return(value)
}

try <- apply(df.1, 1, assignUV.FUN, mat = c.mat)

没有必要将FUN的所有参数传递给apply,我只传递了c.mat,因为它没有被“循环通过”。另外,我尝试避免命名data.frame的{​​{1}},因为df已经具有称为R(F分布的密度)的函数。