为 "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"
您也可以使用 split
和 lapply
如下所示,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"
我尝试做的事情:
在 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"
您也可以使用 split
和 lapply
如下所示,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"