2017-04-03 2 views
0

python dict와 같은 목록을 사용하려고합니다. 함수를 실행할 때마다 추가 할 수 있습니다. 궁극적으로이 기능을 데이터 프레임의 모든 행에 적용하려고합니다. 나는 일부 데이터를 통해 별도로 실행할 때데이터 프레임의 행을 반복하는 함수를 사용하여 목록에 요소 추가

foo <- vector(mode="list", length=2) 
names(foo) <- c("Larry", "Bob") 

myfun <- function(name, round, foo){ 
foo[[name]] <<- c(foo[[name]], round) 
} 

이 작동 : 좀 장난감 데이터에 그것을 밖으로 시도하고

myfun("Larry", "R2", foo) 
myfun("Larry", "R2", foo) 
myfun("Bob", "R1", foo) 
myfun("Larry", "R1", foo) 

foo 
$Larry 
[1] "R2" "R2" "R1" 

$Bob 
[1] "R1" 

하지만 데이터 프레임을 통해 작업 할 수있는 기능을 얻을 수 없다 :

datf <- data.frame(name = c("Larry", "Larry", "Bob", "Larry"), 
        round = c("R2", "R2", "R2", "R1")) 
mapply(myfun, name=datf$name, round=datf$round, foo=foo) 

이 (내가 왜 모르겠어요?) 콘솔에서 다음을 생성합니다

[1] 1 1 2 3 

및 푸에 다음

내 다른 생각은 for 루프에서 myfun()를 적용하려고했다
foo 
$Larry 
[1] 2 

$Bob 
[1] 3 

:

for(row in 1:nrow(datf)){ 
    myfun(datf$name, datf$round, foo) 
} 

그러나 이것은 오류 발생 :

Error in foo[[name]] : no such index at level 2 

모든 통찰력은 인정 될 것입니다!

+0

대신에 간단한 'split()'을 사용하면됩니다 :'with (datf, split 라운드, 이름))'. 언어 간을 이동할 때 단순히 함수 호출을 변환하려고 시도하는 대신 다른 관용구를 배우는 것이 유용합니다. 일반적으로 R의 적절한 함수는 [부작용] (https://en.wikipedia.org/wiki/Side_effect_ (computer_science))이 없어야하므로 함수에서'<< -'를 피하십시오. – MrFlick

답변

0

실행하려는 기능에 대해 조금 더 좋은 예가 있으며 결과가 도움이 될 것입니다. 나는 dplyr :: mutate 함수를 사용하는 것에 대해 생각할 것이다. 단순히 무언가를하려고한다면, 데이터 프레임에 새로운 컬럼을 만들 수 있다고 생각합니다. datf$new <- myfun(inputs)

관련 문제