【问题标题】:Creating names for a list of doubles to a "List of named Vectors"为双打列表创建名称到“命名向量列表”
【发布时间】:2018-12-17 13:12:47
【问题描述】:

我想做什么:

aphid 包中有一个函数 deriveHMM() 需要输入如下列表:

x <- list(c("c"="10.0", "b"="5.0","c"="10.0", "a"="1.0", "a"="2.0",...))

需要创建一个非常大的输入向量,例如

iv <- c(10, 5, 10, 1, 2,...)

重要的是,我的原始输入向量的顺序保持不变。

我需要通过从 .csv 文件中输入大量双精度来自动创建此列表(将双精度导入 R 工作正常)。每个双精度都必须根据与预定义值的最近距离来命名,例如:

从 0 到 2.5 的所有双精度数都应命名为“a”

从 2.5 到 7.5 的所有双精度都应命名为“b”

所有大于 7.5 的双精度数都应命名为“c”

然后所有的双精度都被转换为一个字符(或字符串 (?)),所以方法 deriveHMM() 接受输入。

我很乐意提出建议。我是 R 新手,这是我在 Stackoverflow.com 上的第一篇文章。我不是经验丰富的程序员,但我会尽力理解您的帮助。

编辑: 更新了问题,因为我需要的是“字符的命名向量列表”,就像我上面的示例一样,无需更改顺序。

【问题讨论】:

  • 检查 cut 及其 breakslabels 参数,如所述,例如在这里:Convert continuous numeric values to discrete categories defined by intervals。然后设置结果的名称(setNames)并转换为list
  • 不幸的是它没有解决我的问题,因为我需要维护列表中命名向量的顺序
  • 对不起,我不明白。如果你cut你的向量,顺序不会改变:setNames(iv, cut(iv, c(0, 2.5, 7.5, Inf), labels = letters[1:3]))
  • 对不起,我把评论区弄错了,这对我来说有点新鲜。您的解决方案不会改变顺序,您是对的。但它仍然不被该方法接受,因为它输出了命名双精度。
  • 只需要换上as.character 然后...setNames(as.character(iv), cut(iv, c(0, 2.5, 7.5, Inf), labels = letters[1:3]))

标签: r naming hidden-markov-models


【解决方案1】:

此解决方案使用findInterval 获取tags 向量(名称向量)的索引。

set.seed(1234)    # Make the results reproducible
x <- runif(10, 0, 20)

tags <- letters[1:3]
breaks <- c(0, 2.5, 7.5, Inf)

names(x) <- tags[findInterval(x, breaks)]

x
#         a          c          c          c          c 
# 2.2740682 12.4459881 12.1854947 12.4675888 17.2183077 
#         c          a          b          c          c 
#12.8062121  0.1899151  4.6510101 13.3216752 10.2850228

编辑。

如果您需要 x 属于 "character" 类,请先将索引放入 tags,然后将 x 强制转换为字符,然后才分配名称属性。

i <- findInterval(x, breaks)
x <- as.character(x)
names(x) <- tags[i]
x
#                  a                   c                   c 
# "2.27406822610646"  "12.4459880962968"  "12.1854946576059" 
#                  c                   c                   c 
# "12.4675888335332"  "17.2183076711372"  "12.8062121057883" 
#                  a                   b                   c 
#"0.189915127120912"  "4.65101012028754"   "13.321675164625" 
#                  c 
# "10.2850228268653" 

【讨论】:

  • 这将是完美的解决方案,如果命名双精度可以转换为命名字符。不幸的是,deriveHMM() 不适用于命名双打。当我尝试通过 as.character() 转换它们时,名称标签再次丢失
【解决方案2】:

这是一个示例,其中x 代表您的输入向量。

x <- seq(1, 10, 0.5)

第一步是根据元素的值为元素命名。

names(x) <- ifelse(x <= 2.5, "a", ifelse(x > 2.5 & x <= 7.5, "b", "c"))

接下来,拆分您的向量并应用as.character。我们可以在这里使用by

lst <- by(x, names(x), as.character, simplify = TRUE)
is.list(lst)
# [1] TRUE

结果

lst
#names(x): a
#[1] "1"   "1.5" "2"   "2.5"
#----------------------------------------------------------------------------------------------------------------------- 
#names(x): b
# [1] "3"   "3.5" "4"   "4.5" "5"   "5.5" "6"   "6.5" "7"   "7.5"
#----------------------------------------------------------------------------------------------------------------------- 
#names(x): c
#[1] "8"   "8.5" "9"   "9.5" "10" 

您也可以使用splitlapply,如下所示,by 是这种方法的简写。

lapply(split(x, names(x)), as.character)

【讨论】:

  • 查看this的最后一行代码
猜你喜欢
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多