【问题标题】:How to build a function with factor and vector如何使用因子和向量构建函数
【发布时间】:2019-01-28 14:06:24
【问题描述】:

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

现在这就是我所拥有的,但它只返回 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 中,称为split。试试split(x = 1:5, f = factor(c('a', 'b', 'a', 'b', 'c')))

标签: r function


【解决方案1】:

您的尝试中的一些 cmet:

  • (a) 您的print(':)') 可以很好地进行调试,但如果您打算在完成后将其留在函数中,请使用message 而不是print,以便用户可以根据需要禁用它。
  • (b) 在stop() 中不需要print()。只需使用stop("f and x ...")
  • (c) listf 是一个向量,而不是当您将其定义为 listf &lt;- rep (NA, length(levels(f))) 时的 list。改用listf = list() 将其设为list
  • (d) 假设您的因子具有水平'a''b'。当您执行for (i in levels (f)) 时,这意味着i 首先是'a',然后是'b'。所以当你分配listf[i] &lt;- x[i] 时,R 看到的是listf['a'] &lt;- x['a']listf['a'] 不好,只是因为您应该对单个列表项使用双括号:需要 listf[['a']] &lt;- ...x['a'] 没有任何意义。你想要x的元素对应fwhich元素是'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

【讨论】:

  • 非常感谢!现在我到了这一点:mk_factor_list
  • 这在评论中非常难以阅读。请将其编辑到您的问题中并对其进行格式化以使其可读。
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 2020-11-19
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2015-08-11
  • 2013-01-16
  • 2013-01-12
相关资源
最近更新 更多