[英]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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.