2012-11-17 2 views
1

각각 구조가 동일한 목록의 목록이 있습니다. 각 하위 목록의 요소 중 하나는 키 값입니다. 각 하위 목록에 새 요소를 추가하고 싶습니다.이 요소는 일치하는 키 값이 포함 된 데이터 프레임의 행입니다. 나는 이것이 하나의 목록을 제외하고는 기본적으로 '합병'과 같다고 생각한다.데이터 프레임을 키 값을 기반으로하는 목록과 병합하는 효율적인 방법

그래서이

#Define the list of lists and the data frame 
l <- list() 
l[[1]] <- list(i=1, data=1:5) 
l[[2]] <- list(i=2, data=runif(5)) 
l[[3]] <- list(i=1, data=rnorm(5)) 
d <- data.frame(i=c(1, 2), val1=c(TRUE, FALSE), val2 = c("a", "b")) 

내가 $newData 해당되는으로, l_mod의 각 요소에 대해 등등

> l_mod[[1]] 
$i 
[1] 1 

$data 
[1] 1 2 3 4 5 

$newData 
val1 val2 
TRUE  a 

으로 끝낼 그리고 싶습니다처럼 내 목록과 데이터 프레임보기 행은 d입니다. d의 각 행에는 d$i의 고유 한 값이 있다고 가정 할 수 있습니다.

내 현재의 접근 방식은 일치하는 함수를 작성하고 lapply

matchingRow <- function(indexValue, df) { 
    return(df[df$i==indexValue, -1]) 
} 

l_mod <- lapply(l, function(x) c(x, newData=matchingRow(x$i, d))) 

이 기본적으로 작동에서 호출하는 것이지만, overcomplicated 보인다. (또한 d의 각 열을 새 목록의 별도 요소로 분할하므로 전체 1 행 데이터 프레임을 단일 목록 요소로 배치합니다.)

더 간단한 방법이 있나요?

+0

괄호 For 문을 데리고 좋은 것 같은데, 당신은 데이터 프레임을 부분 집합 때 ..., = FALSE 드롭] 사용하고 싶습니다. drop = TRUE가 기본값입니다. –

+1

@MatthewLundberg, 여기서 방울이 어떻게 생겨나나요? 행렬 및 배열에만 관련이 있습니까? –

+1

은'''d''의 열이 별도의 목록 요소로 반환되지 않도록'''list()'''에''newData = matchingRow (x $ i, d)''를 래핑합니다. 왜 matchingRow를 정의할까요? 당신은 할 수 있습니다 :'''lapply (l, function (x) c (x, list (newData = d [d $ i == x $ i, -1]))))''' – jbaums

답변

3

특정 종자가 없습니다. 단지 마지막에 추가 함수 호출 :

l_mod2 <- lapply(l, function(x) list(x, newData=d[d$i==x$i, -1])) 

    l_mod2[[3]] 
[[1]] 
[[1]]$i 
[1] 1 

[[1]]$data 
[1] -0.109289881 -0.577508057 1.416671342 -1.130346543 -0.002256123 


$newData 
    val1 val2 
1 TRUE a 
+1

dunno가 빠르지 만 이름이 지정된 요소를 목록에 추가 할 수도 있습니다 :'lapply (l, function (x) {x $ newData = d [d $ i == x $ i,]; return (x)})' – Justin

+0

Drew는 반환 된 객체가 각 요소 자체가'''i'',''data'','''newData''의 세 요소를 포함하는 목록이 되길 원했습니다. 여기에서''''''와''data''는 하위 목록 ('''str (l_mod2)''')의 요소입니다. – jbaums

관련 문제