我编写了一个函数,用于从大矩阵(“ 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)
答案 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分布的密度)的函数。