如何用因子和向量构建函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用因子和向量构建函数相关的知识,希望对你有一定的参考价值。
我需要构建一个函数,它将接收一个向量和一个因子,并返回一个包含因子级别的向量除法的列表。这意味着它应该从因子中获取级别,并且对于每个级别,在列表中创建一个项目或元素,其中包含与因子中的级别等效的向量子集。级别名称应用于命名列表项。它是数据帧中的向量和因子。
现在这是我的,但它只返回NA上的列表:
mk_factor_list <- function(x,f) {
{
{if (length(x) == length(f) )
{print(":)")}
else { stop(print("f and x don't have the same length"))}
listf <- rep (NA, length(levels(f)))
for (i in levels (f))
listf[i] <-x[i]
}}
return (listf)
}
答案
关于你的尝试的一些评论:
- (a)你的
print(':)')
可以很好地进行调试,但如果你打算在完成后将它留在函数中,请使用message
而不是print
,以便用户可以根据需要禁用它。 - (b)你在
print()
里面不需要stop()
。只需使用stop("f and x ...")
。 - (c)当你将它定义为
listf
时,list
是一个向量,而不是listf <- rep (NA, length(levels(f)))
。使用list
代替它成为listf = list()
。 - (d)假设您的因子有
'a'
和'b
'。当你做for (i in levels (f))
,这意味着i
将首先是'a'
然后它将是'b'
。 TSo当你指定listf[i] <- x[i]
时,R看到的是listf['a'] <- x['a']
。listf['a']
之所以糟糕,只是因为你应该对一个列表项使用双括号:需要listf[['a']] <- ...
。x['a']
没有任何意义。你想要x
的元素对应f
的哪些元素是'a'
,所以使用x[which(f == i)]
。
把它们放在一起,你应该能得到一个有效的答案。但是如果你想看到一个非常专业的方法,可以在你的控制台中输入split.default
并查看R核心版本。
根据您的评论,这是一个工作版本。我从你的评论中得到的大部分内容都是删除行(为什么在开头的所有额外的{
?)并用我上面的子弹代码替换。
mk_factor_list <- function(x, f) {
if (length(x) != length(f)) {
stop("f and x don't have the same length")
}
listf = list()
for (i in levels (f)) {
listf[[i]] <- x[which(f == i)]
}
return(listf)
}
mk_factor_list(x = 1:5, f = factor(c('a', 'b', 'a', 'b', 'c'))
# $a
# [1] 1 3
#
# $b
# [1] 2 4
#
# $c
# [1] 5
以上是关于如何用因子和向量构建函数的主要内容,如果未能解决你的问题,请参考以下文章
matlab中如何用qr函数求特征值和特征向量,矩阵是mxn