2012-08-30 2 views
0

그래서 목록 개체에 많은 데이터 프레임이 있습니다. 프레임 조건부 적용

ID  Category Value 
2323 Friend  23.40 
3434 Foe   -4.00 

같은

을 구성되어 있습니다 그리고 this topic에 따라리스트로를 얻었다. this topic과 같이 간단한 함수를 실행할 수도 있습니다.

이제 조건부 기능을 lapply로 실행하려고하는데 문제가 있습니다. 'ID'열은 'recnum'과 같이 다른 이름을 가진 테이블이 있으며, 각 데이터 프레임을 살펴보고 'recnum'이라는 열이 있는지 확인하고 그 이름을 ' ID ', 예 :

colnr <- which(names(x) == "recnum" 
if (length(colnr > 0)) {names(x)[colnr] <- "ID"} 

그러나 나는 지역 범위에 문제가있어 누가 무엇을 압니까. 어떤 아이디어?

+1

최소 재현 예를하십시오 (plyr이 좋은 패키지이지만)

단지의 대안으로, 당신은 gsub를 사용하여 추가 패키지를로드 피할 수 예는 그렇지 않습니다. http://stackoverflow.com/a/5965451/334485 – themel

답변

1

mnel의 대답 중 두 번째 부분을 보면 foo 함수가 마지막 표현으로 x을 평가한다는 것을 알 수 있습니다. 그렇지 않으면 lapply에 전달 된 익명 함수 내에서 직접 목록의 data.frames 이름을 변경하려고하면 작동하지 않을 수 있습니다. 제목과 lapply에 대한 텍스트 이야기하지만, 코드 -

xx <- list(data.frame("recnum" = 1:3, "recnum2" = 1:3), 
    data.frame("ID" = 4:6, "hat" = 4:6)) 

lapply(xx, function(x){ 
    names(x) <- gsub("^recnum$", "ID", names(x)) 
    return(x) 
}) 
# [[1]] 
# ID recnum2 
# 1 1  1 
# 2 2  2 
# 3 3  3 

# [[2]] 
# ID hat 
# 1 4 4 
# 2 5 5 
# 3 6 6 
3

rename 기능을 plyr에서 사용하십시오. 이 이름으로 이름을 변경, 위치하지 :

x <- data.frame(ID = 1:2,z=1:2) 
y <- data.frame('recnum' = 1:2,z=3:4) 

.list <- list(x,y) 
library(plyr) 
lapply(.list, rename, replace = c('recnum' = 'ID')) 

[[1]] 
    ID z 
1 1 1 
2 2 2 

[[2]] 
    ID z 
1 1 3 
2 2 4 

원래 코드는 잘 작동 : 문제가 무엇인지

foo <- function(x){ 
    colnr <- which(names(x) == "recnum") 

    if (length(colnr > 0)) {names(x)[colnr] <- "ID"} 
    x 
} 
.list <- list(x,y) 
lapply(.list, foo) 

확실하지.