如何用因子和向量构建函数

问题描述 投票:0回答:1

我需要构建一个函数,它将接收一个向量和一个因子,并返回一个包含因子级别的向量除法的列表。这意味着它应该从因子中获取级别,并且对于每个级别,在列表中创建一个项目或元素,其中包含与因子中的级别等效的向量子集。级别名称应用于命名列表项。它是数据帧中的向量和因子。

现在这是我的,但它只返回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)
}
r function
1个回答
1
投票

关于你的尝试的一些评论:

  • (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
© www.soinside.com 2019 - 2024. All rights reserved.