2014-07-17 3 views
1

데이터 프레임에있는 데이터를 가져 와서 특정 변수를 문자 벡터로 바꾼다. 이것은 'id'에 의해 수행되고 그 결과는리스트에 저장됩니다.함수에 전달할 데이터 프레임에서 열/변수 찾기 - R

이 무슨 일이 일어나고 있는지 보여줍니다

###sample data 
id<-rep(1:5, each=4) 
fruits<-c("orange", "apple", "banana", "lemon", "kiwi") 
shapes<-c("triangle", "square", "circle", "rhombus") 
dat<-as.data.frame(id) 
dat$fruits<-sample(fruits,20,replace=T) 
dat$shapes<-sample(shapes,20,replace=T) 
dat$anotherid<-rep(1:2, each=10) 

dat 

이 샘플 데이터는 ID-보내고 관찰을위한 두 가지 변수, 우리는 벡터 시퀀스로 설정하실 수 있습니다 두 가지 변수가 포함되어 있습니다. 이것은 내가 그은을 수행 때우기 스크립트가

id fruits shapes anotherid 
1 1 kiwi triangle   1 
2 1 banana rhombus   1 
3 1 lemon rhombus   1 
4 1 lemon rhombus   1 
5 2 orange rhombus   1 
6 2 lemon triangle   1 
7 2 apple triangle   1 
8 2 banana circle   1 
9 3 apple circle   1 
10 3 kiwi square   1 
11 3 apple rhombus   2 
12 3 orange rhombus   2 
13 4 orange triangle   2 
14 4 orange rhombus   2 
15 4 apple triangle   2 
16 4 lemon triangle   2 
17 5 banana square   2 
18 5 orange rhombus   2 
19 5 orange triangle   2 
20 5 orange rhombus   2 

: '과일'과 '모양'이 무작위로 선택되어 있기 때문에 것이다이 같은 (분명히 코드를 실행할 때마다 다른 결과를 반환합니다 보이는 . 변환 말, 우리는 문자 벡터에 변수 '과일'을 설정하고자하는, 그리고 'ID'에 의해 그것을 할이 :

n<-which(colnames(dat)=="id") 
n1<-which(colnames(dat)=="fruits") 
z<-split(dat[n1],dat[n], drop=TRUE) 
L = lapply(z, function(x) as.character(unlist(x))) 
L 

그것은 다음과 같습니다 : 그래서

$`1` 
[1] "kiwi" "banana" "lemon" "lemon" 

$`2` 
[1] "orange" "lemon" "apple" "banana" 

$`3` 
[1] "apple" "kiwi" "apple" "orange" 

$`4` 
[1] "orange" "orange" "apple" "lemon" 

$`5` 
[1] "banana" "orange" "orange" "orange" 

, 나는 셈이다 g를 함수로 바꾼다. 내가 변수 어떤 'ID'및 기타 변수를 호출 할 수 있도록 내가 설정하는 함수는 일반적인 만들려고 노력하고있다, 그러나

myfunction<-function(dat,id,fruits){ 
    n<-which(colnames(dat)=="id") 
    n1<-which(colnames(dat)=="fruits") 
    z<-split(dat[n1],dat[n], drop=TRUE) 
    L = lapply(z, function(x) as.character(unlist(x))) 
    return(L) 
} 

myfunction(dat,id,fruits) 

: 다음과 같은 처리를 할 경우는 위의 예를 들어 잘 작동 벡터로. 아래에서, 나는 'col1'인수를 사용하여 id 변수를 참조하고 'col2'는 벡터화를위한 변수를 나타냅니다. 위의 함수에서 col1과 col2를 제거했습니다. ('col1'& 'col2'라는 변수를 찾고 있기 때문에 분명히 작동하지 않습니다.

말하자면, id 변수로 'anotherid'를 사용하고 벡터화 ID로 'shapes'를 사용하고 싶습니다. 내가 뭔가 잘못하고 있어요 이것은 내가 함수의 dataframe에 columnn 번호를 찾기 위해 노력하고 어떻게 작동하지 않습니다 :

myfunction<-function(dat,col1,col2){ 
    n<-which(colnames(dat)==col1) 
    n1<-which(colnames(dat)==col2) 
    z<-split(dat[n1],dat[n], drop=TRUE) 
    L = lapply(z, function(x) as.character(unlist(x))) 
    return(L) 
} 

myfunction(dat,anotherid,shapes) 

(단지 완전성에 대한) 다음 오류 메시지

Error in which(colnames(dat) == col1) : object 'anotherid' not found 

도움을 주시면 감사하겠습니다. 분명히이 간단한 예제를 통해 코드를 적절한 변수 이름으로 변경할 수 있습니다.하지만 100 개의 변수가있는 데이터 프레임에 대해 일반화하고이 스크립트를 여러 번 사용하려면 일반 함수가 가장 좋습니다.

+0

'set.seed()'를 사용하여'sample'을 재현성있게 만드십시오. 그러면 다른 사람들이 귀하의 질문에 실제로 답변했는지 여부를 확인할 수 있습니다. – A5C1D2H2I1M1N2O1R2T1

답변

1

좋아요 그래서 여기 문제이다 - 첫 번째 기능에, 당신은 그냥 쉽게 myfunction(dat)를 호출하고 동일한 결과를 얻을 수 있도록

myfunction<-function(dat,id,fruits){ 
    n<-which(colnames(dat)=="id") 
    n1<-which(colnames(dat)=="fruits") 
    z<-split(dat[n1],dat[n], drop=TRUE) 
    L = lapply(z, function(x) as.character(unlist(x))) 
    return(L) 
} 

인수 idfruits 실제로 함수 본문에서 사용되지 않는다 : dat가 사용되는 유일한 인수이며, 때문에

$`1` 
[1] "apple" "kiwi" "orange" "apple" 

$`2` 
[1] "orange" "banana" "lemon" "kiwi" 

$`3` 
[1] "kiwi" "kiwi" "apple" "kiwi" 

$`4` 
[1] "kiwi" "apple" "kiwi" "banana" 

$`5` 
[1] "orange" "orange" "orange" "orange" 

이다 내부적으로도 글로벌 환경에서 dat라는 이름의 객체가 있기 때문에 함수가 실제로 myfunction(dat=dat)하고 있습니다. 함수 인수로 dat 대신 Dat 또는 다른 것을 사용한 경우에는 작동하지 않습니다.당신이

myfunction<-function(dat,col1,col2){ 
    n<-which(colnames(dat)==col1) 
    n1<-which(colnames(dat)==col2) 
    z<-split(dat[n1],dat[n], drop=TRUE) 
    L = lapply(z, function(x) as.character(unlist(x))) 
    return(L) 
} 

에 기능을 개정 myfunction(dat,anotherid,shapes) 호출 할 때 이제, 당신이 따옴표없이 통과하기 때문에 오류 object 'anotherid' not found을 가지고, 그래서 기능은

myfunction(dat=dat, col1=anotherid,col2=shapes) 

을 시도하고 당신은이 없다면 전역 환경 (dat의 열 이름에 포함 된 유효한 문자 이름)에 anotherid이라는 객체를 추가하면 문자 그대로 이라는 객체를이라는 객체로 사용하려고하기 때문에 오류가 발생합니다 0. col1이 오류를 일으키지 않고 기능을 중지하지 않은 경우에도 col2에 대해서도 마찬가지입니다. 그럼 할 수있는 것은 단지 두 번째 함수에 따옴표로 묶인 이름을 전달하는 것입니다 (최소한의 수정으로 생각합니다). 그러나 오류를 확인하기 위해 방어 코드를 추가하는 것도 고려해 볼 수 있습니다. 이 버전에서

myFun <- function(Dat,col1=NULL,col2=NULL){ 
    ## 
    cNames <- names(Dat) 
    if(is.null(col1)){ 
    if(!("id" %in% cNames)){ 
     col1 <- cNames[1] 
    } else { 
     col1 <- "id" 
    } 
    } 
    ## 
    if(is.null(col2)){ 
    if(!("fruits" %in% cNames)){ 
     col2 <- cNames[2] 
    } else { 
     col2 <- "fruits" 
    } 
    } 
    ## Dat fixed from dat[,col2] and dat[,col1] per your comment below 
    z <- split(
    Dat[,col2], 
    Dat[,col1], 
    drop=TRUE 
) 
    ## 
    L <- lapply(
    z, 
    function(x){ 
     as.character(unlist(x)) 
    } 
) 
    ## 
    return(L) 
} 
## 
myFun(Dat=dat) 
$`1` 
[1] "apple" "kiwi" "orange" "apple" 

$`2` 
[1] "orange" "banana" "lemon" "kiwi" 

$`3` 
[1] "kiwi" "kiwi" "apple" "kiwi" 

$`4` 
[1] "kiwi" "apple" "kiwi" "banana" 

$`5` 
[1] "orange" "orange" "orange" "orange" 
## 
> myFun(Dat=dat,col1="anotherid") 
$`1` 
[1] "apple" "kiwi" "orange" "apple" "orange" "banana" "lemon" "kiwi" "kiwi" "kiwi" 

$`2` 
[1] "apple" "kiwi" "kiwi" "apple" "kiwi" "banana" "orange" "orange" "orange" "orange" 

, 정말 그냥 myFun(Dat=dat)를 호출 할 수 있습니다 col1col2 기본값을 사용하거나 수동으로 col1col2을 지정할 수 있습니다. 어느 경우 든 Dat을 지정해야합니다. 이것은 급하게 작성했기 때문에 이상적인 강력한 함수는 아니지만 함수에 추가 할 수있는 유용한 인수 인 기본 인수 값을 사용합니다. 개인적으로, 나는 당신이 사용하려고하는 객체와 같은 함수 인수를 명명하는 것이 좋은 생각이라고 생각하지 않지만, 당신이 선택한다면 확실히 할 수 있습니다.

+1

조언 해 주셔서 감사합니다. 당신이 만드는 점수는 잘 받아 들여집니다. 당신이 쓴 기능에 대한 메모. 그것을 스캐닝하는 것은, 나는 그 선들이 .......... (실제로는 'Dat'이어야한다.) (데이터 프레임 이름). 처음에는 dat을 사용하여 혼란을 가져 오게되어 죄송합니다. – jalapic

+0

예! 잘 잡으십시오 - 이것은 내가 취하고있는 것과 정확히 같은 것입니다. 'dat'이 지구 환경에 존재하지 않는다면, 이로 인해 오류가 발생했을 수 있습니다. – nrussell

관련 문제