为 "List of named Vectors" 的双打列表创建名称

Creating names for a list of doubles to a "List of named Vectors"

我尝试做的事情:

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 工作正常)。每个 double 必须根据其与预定义值的最近距离获得一个名称,例如:

所有从 0 到 2.5 的双打范围都应命名为 "a"

所有从 2.5 到 7.5 的双打都应命名为 "b"

所有大于 7.5 的双打都应命名为 "c"

然后所有双打都转换为字符(或字符串(?)),因此方法 deriveHMM() 接受输入。

我很乐意提出建议。我是 R 的新手,这是我在 whosebug.com 上的第一个 post。我不是一个经验丰富的程序员,但我尽力理解你的帮助。

编辑: 更新了问题,因为我需要的是一个 "List of named vectors of characters",就像我上面的例子一样,没有改变顺序。

这是一个示例,其中 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 是 shorthand 这种方法。

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

此解决方案使用 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 成为 class "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"