R中向量的映射

R中向量的映射,r,apply,lapply,sapply,mapply,R,Apply,Lapply,Sapply,Mapply,我在谷歌上看到过几个例子,但仍然不太了解它是如何工作的 这就是我要做的 我有一个文本数组 > V <- c("aa","bb","cc","dd","ee","ff") > V [1] "aa" "bb" "cc" "dd" "ee" "ff" 这是一个向量,由V的3个连续元素串联而成 我正在考虑使用mapply之类的工具 mapply(function(x,i){paste(x[i:i+2],sep="",collapse="")},V,1:(length(V)-2))

我在谷歌上看到过几个例子,但仍然不太了解它是如何工作的

这就是我要做的

我有一个文本数组

> V <- c("aa","bb","cc","dd","ee","ff")
> V
[1] "aa" "bb" "cc" "dd" "ee" "ff"
这是一个向量,由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"

如果您有多个不同的向量,并且每个向量需要不同数量的元素串联,则需要
mappy
(您可以将其与函数一起使用)。

您不需要任何花哨的
mappy

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"

根据您的评论,您可以创建一个函数,并使用
lappy
创建列表:

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"

pase2如果您的项目需要许多连续的元素,这里有一个解决方案。还有其他方法,
mapply
只是其中之一:

mapply(function(x,y) paste(V[x:y], collapse=""), 1:(length(V)-2), 3:length(V))
#[1] "aabbcc" "bbccdd" "ccddee" "ddeeff"

根据您的评论,您可以创建一个函数,并使用
lappy
创建列表:

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"

paste2这里有另一种选择,使用
apply()
embed()


下面是使用
apply()
embed()


谢谢我试着独自做下一步。我想做的是把这个mappy函数应用到一个这样的字符向量列表中,所以我希望V在理想情况下是一个变量……我添加了一个函数方法。谢谢。我试着独自做下一步。我想做的是将这个mappy函数应用到一个这样的字符向量列表中,这样我希望V在理想情况下是一个变量……我添加了一个函数方法。或者在没有所有的反转和
apply()
的情况下,您可以执行
do.call(粘贴0,data.frame(嵌入(V,3))[3:1])
。使用
embed()
真是个好主意,谢谢大家!!这么短的时间内有这么多答案!太棒了!或者不使用所有的反转和
apply()
就可以执行
do.call(粘贴0,data.frame(嵌入(V,3))[3:1])
。使用
embed()
真是个好主意,谢谢大家!!这么短的时间内有这么多答案!太棒了!您的第二个块分别生成9个
“aabbcc”“ddeeff”
Oops,有几个bug,但现已修复。您的第二个块分别生成9个
“aabbcc”“ddeeff”
Oops,有几个bug,但现已修复。