MAPPLY跨R中的向量
MAPPLY across a vector in R
我在 Google 上看过几个例子,但还是不太明白它是如何工作的
这就是我想要做的。
我有一个文本数组
> V <- c("aa","bb","cc","dd","ee","ff")
> V
[1] "aa" "bb" "cc" "dd" "ee" "ff"
我想要一个长度为 length(V)-2 (=4) 的数组作为输出
组成
[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
这是一个由 V
的 3 个连续元素串联而成的向量
我正在考虑使用像 mapply 这样的东西
mapply(function(x,i){paste(x[i:i+2],sep="",collapse="")},V,1:(length(V)-2))
但这不是正确的语法
谢谢
你不需要花哨的东西mapply
:
n = length(V)
paste0(V[1:(n - 2)], V[2:(n - 1)], V[3:n])
这里有一个参数化的解法,你还是不需要mapply
:
i = 3
apply(matrix(V, nrow = length(V) + 1, ncol = i)[1:(length(V) - i + 1), ],
MARGIN = 1, FUN = paste, collapse = "")
您可以将其功能化:
f = function(V, i) {
apply(matrix(V, nrow = length(V) + 1, ncol = i)[1:(length(V) - i + 1), ],
MARGIN = 1, FUN = paste, collapse = "")
}
然后您可以将它应用于这样的向量列表:
lapply(list(c("a", "b", "c", "d"), letters), f, i = 3)
# [[1]]
# [1] "abc" "bcd"
#
# [[2]]
# [1] "abc" "bcd" "cde" "def" "efg" "fgh" "ghi" "hij" "ijk" "jkl" "klm" "lmn" "mno" "nop" "opq"
# [16] "pqr" "qrs" "rst" "stu" "tuv" "uvw" "vwx" "wxy" "xyz"
如果您有多个不同的向量 和 ,您 将 需要 mapply
(并且您可以将其与函数一起使用)对于每个向量,您需要 不同 个元素的串联。
如果您的项目需要许多连续的元素,这里有一个解决方案。还有其他方法,mapply
只是一个:
mapply(function(x,y) paste(V[x:y], collapse=""), 1:(length(V)-2), 3:length(V))
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
根据您的意见,您可以创建一个函数并使用 lapply
作为列表:
paste2 <- function(vec, n=3) {
mapply(function(x,y) paste(vec[x:y], collapse=""), 1:(length(vec)-(n-1)), n:length(vec))
}
## single vector still works
paste2(V)
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
## with list
lst <- rep(list(V), 2)
lapply(lst, paste2)
#[[1]]
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
#
#[[2]]
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
这是使用 apply()
和 embed()
的另一种选择
rev(apply(embed(rev(V),3), 1, paste, collapse=""))
# [1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
我在 Google 上看过几个例子,但还是不太明白它是如何工作的
这就是我想要做的。
我有一个文本数组
> V <- c("aa","bb","cc","dd","ee","ff")
> V
[1] "aa" "bb" "cc" "dd" "ee" "ff"
我想要一个长度为 length(V)-2 (=4) 的数组作为输出 组成
[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
这是一个由 V
的 3 个连续元素串联而成的向量我正在考虑使用像 mapply 这样的东西
mapply(function(x,i){paste(x[i:i+2],sep="",collapse="")},V,1:(length(V)-2))
但这不是正确的语法
谢谢
你不需要花哨的东西mapply
:
n = length(V)
paste0(V[1:(n - 2)], V[2:(n - 1)], V[3:n])
这里有一个参数化的解法,你还是不需要mapply
:
i = 3
apply(matrix(V, nrow = length(V) + 1, ncol = i)[1:(length(V) - i + 1), ],
MARGIN = 1, FUN = paste, collapse = "")
您可以将其功能化:
f = function(V, i) {
apply(matrix(V, nrow = length(V) + 1, ncol = i)[1:(length(V) - i + 1), ],
MARGIN = 1, FUN = paste, collapse = "")
}
然后您可以将它应用于这样的向量列表:
lapply(list(c("a", "b", "c", "d"), letters), f, i = 3)
# [[1]]
# [1] "abc" "bcd"
#
# [[2]]
# [1] "abc" "bcd" "cde" "def" "efg" "fgh" "ghi" "hij" "ijk" "jkl" "klm" "lmn" "mno" "nop" "opq"
# [16] "pqr" "qrs" "rst" "stu" "tuv" "uvw" "vwx" "wxy" "xyz"
如果您有多个不同的向量 和 ,您 将 需要 mapply
(并且您可以将其与函数一起使用)对于每个向量,您需要 不同 个元素的串联。
如果您的项目需要许多连续的元素,这里有一个解决方案。还有其他方法,mapply
只是一个:
mapply(function(x,y) paste(V[x:y], collapse=""), 1:(length(V)-2), 3:length(V))
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
根据您的意见,您可以创建一个函数并使用 lapply
作为列表:
paste2 <- function(vec, n=3) {
mapply(function(x,y) paste(vec[x:y], collapse=""), 1:(length(vec)-(n-1)), n:length(vec))
}
## single vector still works
paste2(V)
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
## with list
lst <- rep(list(V), 2)
lapply(lst, paste2)
#[[1]]
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
#
#[[2]]
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"
这是使用 apply()
和 embed()
rev(apply(embed(rev(V),3), 1, paste, collapse=""))
# [1] "aabbcc" "bbccdd" "ccddee" "ddeeff"