89

これらの Python リスト内包表記に相当する R は次のとおりです。

[(i,j) for i,j in zip(index, Values)]
[(i,j) for i,j in enumerate(Values)]
[(i,j) for i,j in enumerate(range(10,20))]   %MWE, indexing or enumerating to 
                                            %keep up with the index, there may 
                                            %be some parameter to look this up

出力例

>>> [(i,j) for i,j in enumerate(range(10,20))]
[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)]

私は以前にRでいくつかのトリックでこの問題を解決しましたが、もう思い出せません。最初のアイデアは itertools -pkg でしたが、もっと慣用的な方法を見つけたいと思っています。

4

9 に答える 9

43

R のリスト内包表記については、 here or thereなど、いくつかの議論がありました。hashパッケージは、辞書のような構造も提供します。ただし、他の人が言ったように、ある言語機能を別の言語機能にマッピングしようとすることは (たとえこれがプログラミング言語の比較が実際に提供するものであっても)、それが何に慣れているのかを明確に理解することなしに困難です。たとえば、zip()次のように R でPython を模倣できます。

パイソン

In [1]: x = [1,2,3]
In [2]: y = [4,5,6]
In [3]: zip(x, y)
Out[3]: [(1, 4), (2, 5), (3, 6)]

R

> x <- 1:3
> y <- 4:6
> list(x, y)                     # gives a simple list
> as.list(paste(x, y))           # three tuples, as a list of characters
> mapply(list, x, y, SIMPLIFY=F) # gives a list of 3 tuples
> rbind(x, y)                    # gives a 2x3 matrix 

ご覧のとおり、これは実際に後で結果をどうしたいかによって異なります。

于 2012-02-14T20:51:44.477 に答える
9

ベクトルのリストを作成する別のオプションは、@peterhurford で見られる Map 関数を使用することです: https://rdrr.io/github/peterhurford/funtools/src/R/zippers.R

> x <- 1:3
> y <- 4:6
> z <- 7:9
> Map(c, x, y, z)
[[1]]
[1] 1 4 7

[[2]]
[1] 2 5 8

[[3]]
[1] 3 6 9
于 2019-01-25T14:32:55.047 に答える
6

それが行列の Python 印刷表現である場合、次のコード:

j <- 10:20
matrix(c(seq_along(j), j), ncol=2)
#------------
      [,1] [,2]
 [1,]    1   10
 [2,]    2   11
 [3,]    3   12
 [4,]    4   13
 [5,]    5   14
 [6,]    6   15
 [7,]    7   16
 [8,]    8   17
 [9,]    9   18
[10,]   10   19
[11,]   11   20

あなたは、希望する出力の構造に関して、Python ユーザーではない私たちをまだ暗闇の中に残しています。「リスト」という用語を使用していますが、出力はタプルの順序付けられたセットを示唆しています。

@chi のガイダンスを考えると、非常に R 中心の「データフレーム」構造の使用を提案することもできます。

x <- 1:3
y <- 4:6
dfrm <- data.frame(x=x, y=y)

...これは、列のタイプに関してリストの柔軟性を持ち、行と列のインデックス付けに関してマトリックスのアクセス機能を備えています。または、hhh の要求を使用して、デフォルトで "1" から始まるベクトルを10:20使用して、j ベクトルの暗黙的にインデックス付けされた値を作成rownamesできますが、"0" で始まる文字ベクトルになるように変更できます。

dfrm <- data.frame(j=10:20)
dfrm[3, ]
#[1] 12

 rownames(dfrm) <- 0:10
 dfrm["0",]
# [1] 10

残念ながら、不注意な人は dfrm[0, ] が幸せな呼び出しではなく、長さ 0 のベクトルを返すことに気付くでしょう。

于 2012-02-14T18:12:55.057 に答える
0
# similar to python. return a list of list. Short sequences get recycled.
zip <- function(...){ 
    all.list <- list(...)
    ele.names <- names(all.list)
    max.length <- max(sapply(all.list, length))
    lapply(0:(max.length - 1), function(i) {
        res <- lapply(all.list, function(l) l[i %% length(l) + 1]) 
        names(res) <- ele.names
        res
    })
}
于 2018-03-16T08:46:22.450 に答える