3

、およびに変換list1する最もエレガントな方法は何ですか?list2list2list1

list1<- c('a','b','c','d','e','f','g','h','i')
list2<- c('abc','def','ghi')

つまり、要素を 3 つのグループに接触させます。

ありがとう

4

3 に答える 3

3

Let list1 <- letters[1:10](ベクトルの長さが 3 の倍数でない場合にどのように機能するかを示すため)。次に、これを試してください:

リスト1からリスト2

# method 1 (seems to be the fastest so far, 
# my suspicions about loop being slower were wrong)
list2 <- sapply(split(list1, (seq_along(list1)-1) %/% 3), paste, collapse = "")
# alternatively as @flodel mentions
list2 <- tapply(list1, (seq_along(list1)-1) %/% 3, paste, collapse = "")

このバージョンは(ベンチマークは表示されていません)tapplyと同じ時間に実行されます。sapply+split

この投稿で@JoshOBrienのアイデアを使用して、さらに一歩進んでください

# method 2
pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]])"
strsplit(paste(list1, collapse=""), pattern, perl=TRUE)[[1]]
# [1] "abc" "def" "ghi" "j"  

jそして、最後の部分を最後の 2 つ前 (ここではto ghi) に連結したい場合は、次のようにします。

pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]]{3})"
strsplit(paste(list1, collapse=""), pattern, perl=TRUE)[[1]]
# [1] "abc"  "def"  "ghij"

リスト2からリスト1

unlist(strsplit(list2, ""), use.names=FALSE)
#  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

method1method2および eddi のベンチマークは次のとおりです。

データ:

list1 <- sample(letters, 1e5, replace=TRUE)

機能:

arun <- function() {
    pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]])"
    strsplit(paste(list1, collapse=""), pattern, perl=TRUE)[[1]]
}

arun2 <- function() {
    unname(sapply(split(list1, (seq_along(list1)-1) %/% 3), paste, collapse = ""))
}

eddi <- function() {
    substring(paste(list1, collapse = ""),
          seq(1, length(list1), 3),
          pmin(seq(3, length(list1)+2, 3), length(list1)))    
}

ベンチマーク:

require(microbenchmark)
microbenchmark(t1 <- arun(), t2 <- eddi(), t3 <- arun2(), times=10)
identical(t1, t2) # TRUE
identical(t1, t3) # TRUE

# Unit: milliseconds
#           expr       min        lq    median        uq       max neval
#   t1 <- arun() 3352.9867 3400.8627 3512.7037 3585.6499 3635.2182    10
#   t2 <- eddi() 3302.0925 3318.4184 3356.2109 3409.9728 3487.7220    10
#  t3 <- arun2()  474.9235  494.7407  539.4406  641.2605  907.9072    10
于 2013-05-06T21:47:46.683 に答える