2013-04-18 2 views
0

R에서 나는 사전에 (파이썬과 같은 의미로) 한 쌍이 있는데 일치하는 정수 값을 갖는 키로 (i, j)을 가지고 있는지 궁금합니다. -> 1R의 사전과 쌍

(1, 3) -> 3

(1, 2) : 내 사전의 시각이 될 것이다 R.이를 구성하는 청소하거나 직관적 인 방법을 보지 못했다

(1, 4) -> 4

(1, 5) - 모든 도움> 3 개

감사합니다!

EDIT : 이러한 키 값 쌍을 삽입하는 코드 줄은 카운터 i와 j가있는 루프에 있습니다.

for(i in 1: 5) 
{ 
    for(j in 2: 4) 
    { 
    maps[i][j] = which.min(someVector) 
    } 
} 

어떻게 내가 찾고 있어요 기능을 얻을 수 maps[i][j]을 변경합니까 : 예를 들어, 내가 가진 생각?

a = data.frame(spam = c("alpha", "gamma", "beta"), 
       shrub = c("primus","inter","parus"), 
       stringsAsFactors = FALSE) 
rownames(a) = c("John", "Eli","Seth") 
> a 
     spam shrub 
John alpha primus 
Eli gamma inter 
Seth beta parus 

>  a["John", "spam"] 
[1] "alpha" 

이라는 키를 2 차원 사전 스타일의 객체의 경우를 처리합니다

+1

예제에서와 같이,'i'와'j'가 둘 다 정수라고 가정 할 수 있습니까? 그렇다면 다차원 배열을 사용할 수 있습니다. 이 경우, 단지 2D (매트릭스)입니다. –

+3

R 구조체는'data.frame'과'data.table'입니다 – eddi

+0

네, 정수형과 정수형 사이의 맵으로 어떻게 할 수 있습니까? – CodeKingPlusPlus

답변

3

벡터 목록으로이 작업을 수행 할 수 있습니다.

maps <- lapply(vector('list',5), function(i) integer(0)) 
maps[[1]][2] <- 1 
maps[[1]][3] <- 3 
maps[[1]][4] <- 4 
maps[[1]][5] <- 3 

그렇다고 할 일을 수행하는 데 더 좋은 방법이 있지만 충분한 배경을 제공하지 못했다고합니다.

3

넌 그냥 data.frame을 사용할 수 있습니다. 키는 정수가 될 수도 있지만 숫자가 아닌 문자 여야합니다.

+0

재미 있습니다. 제 편집을 확인해보세요. 루프에서 인덱스 변수로 키를 사용할 때 이것을 구현하는 방법을 알고 싶습니다. – CodeKingPlusPlus

2

R 행렬을 사용하면이 작업을 수행 할 수 있습니다. 스파 스 버전과 밀도 버전이 있습니다. 나는 tm- 패키지가 희소 행렬에 변형을 사용하여 사전을 구현한다는 것을 믿는다. 여기서는 행렬 M의 [i, j] 요소를 추출하는 방법을 보여줍니다. 여기서 [i, j]는 2 열 행렬로 표현됩니다.

M<- matrix(1:20, 5, 5) 
ij <- cbind(sample(1:5), sample(1:5)) 

> ij 
    [,1] [,2] 
[1,] 4 4 
[2,] 1 2 
[3,] 5 3 
[4,] 3 1 
[5,] 2 5 
> M[ij] 
[1] 19 6 15 3 2 

@Justin 또한 위치에 의해 색인을 생성 할 수 있습니다 목록을 사용할 수 있음을 지적한다 :하지만 문자열 (이름, 사이,

L <- list(as.list(letters[1:5]), as.list(paste(2,letters[1:5]))) 

> L[[1]][[2]] 
[1] "b" 
> L[[2]][[2]] 
[1] "2 b" 
4

모두 이름 목록 및 환경 매핑을 제공을하는 키 역할을 함) 및 임의의 R 개체 (값). ij이 단순하다면 (예 : 정수로 표시되는 것처럼) 일부 구분 기호로 연결하여 고유 한 문자열을 쉽게 만들 수 있습니다. 이 여기에 당신이 빨리되는하는 data.table이 할 거라고 방법

mykey <- function(i, j) { 
    paste(i, j, sep="|") 
} 

maps <- list() 
for(i in 1: 5) { 
    for(j in 2: 4) { 
    maps[mykey(i,j)] <- which.min(someVector) 
    } 
} 

키 유효한 이름이/당신은

maps[[mykey(i,j)]] 
+0

또는 벡터리스트 인'list (c (0,1,3,4,3)) '를 사용할 수 있습니다. –

+0

@ JoshuaUlrich 어떻게 조회합니까? –

+0

이것은 어떤 수의 차원으로도 일반화 할 수 있고 저장할 요소의 수에 대한 초기 가정이없는 한 최상의 답변입니다. – flodel

3

으로 특정 ij에 대한 값을 추출 할 수 있도록 것이며, 쉽게 확장 :

library(data.table) 
d = data.table(i = 1, j = 2:5, value = c(1,3,4,3), key = c("i", "j")) 

# access the i=1,j=3 value 
d[J(1, 3)][, value] 

# change that value 
d[J(1, 3), value := 12] 

# do some vector assignment (you should stop thinking loops, and start thinking vectors) 
d[, value := i * j]