【问题标题】:Function to group elements of a vector/list对向量/列表的元素进行分组的函数
【发布时间】:2017-09-07 16:08:53
【问题描述】:

假设我有一个向量,例如

vec <- 0:10

还有一个函数比如

f <- function (x) x %% 3

R 中是否有一个内置函数可以根据f 的返回值将该向量分组到每个元素上?如果不是,那么使用内置函数实现此功能的最直接方法是什么?

预期的返回值为

list(c(0,3,6,9), c(1,4,7,10), c(2,5,8))

举一个更复杂的例子,取一个字符串向量,并将那些是字谜的组合在一起(即它们由相同的字母组成)。在这种情况下,f 将接受一个字符串,将其小写,然后对其进行排序。在 Unix 系统上有一个可用的单词列表:

words <- scan('/usr/share/dict/words', what=character, sep='\n')

我不坚持使用这些特定的数据结构(向量、列表),如果它们不是最适合 R 中的这项任务的话。

【问题讨论】:

  • splitsplit(0:10, (0:10) %% 3)
  • 您需要vec &lt;- 0:10,然后使用split(vec, f(vec))。正如你提到的那样,为了分解字符串,有strsplit。喜欢strsplit(c("this is some string", "and another one"), split="")
  • 谢谢。您会发布答案还是这个问题太简单而无法保留,我最好删除它?
  • 很可能是骗子。也许这个:stackoverflow.com/questions/21499679/…

标签: r grouping


【解决方案1】:

split 可以根据因素将向量分成列表(除其他外)。有关更多信息,请参阅?split。我开始对基于字谜对单词向量进行分组感兴趣。所以这里有一个解决方案

vec = c("stop", "pots", "leaves")
split(vec, sapply(vec, function(x)
    paste(sort(unlist(strsplit(tolower(gsub(" ", "", x)), ""))), collapse = "")))
#$aeelsv
#[1] "leaves"

#$opst
#[1] "stop" "pots"

【讨论】:

    【解决方案2】:

    您可以使用dplyr 并将输入转换为data.frame。从那里开始,代码更容易阅读:

    library(dplyr)
    data.frame(
       value = vec,
       stringsAsFactors = T
    ) %>%
    mutate(
      result = f(value)
    ) %>%
    group_by(result) %>%
    summarize(
       list_result = list(value)
    ) %>%
    .$list_result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多