R로 더 많은 작업 수행 : 명명 된 벡터를 사용한 빠른 조회 테이블

Arkansas의 주 약자는 무엇입니까? AR인가요? AK? 같이?

정보가 포함 된 데이터 프레임이있을 수 있습니다. 또는 카테고리가있는 하나의 열과 값이있는 다른 열이있는 모든 정보. 어떤 시점 에서 라고도하는 카테고리별로 을 찾고 싶을 가능성이 있습니다. 많은 프로그래밍 언어에는 키-값 쌍으로 작업하는 방법이 있습니다. 이것은 명명 된 벡터를 사용하여 R에서도 쉽게 수행 할 수 있습니다. 방법은 다음과 같습니다.

상태 이름과 약어가있는 데이터가 있는데,이 데이터를라는 데이터 프레임에 저장했습니다 postal_df. (이 데이터 프레임을 생성하는 코드는이 글의 하단에 있습니다.

나는 tail(postal_df)그것이 어떻게 생겼는지보기 위해 달려 갈 것이다 .

 주 우편 번호 45 Vermont VT 46 Virginia VA 47 Washington WA 48 West Virginia WV 49 Wisconsin WI 50 Wyoming WY

룩업 테이블 / 명명 된 벡터에는 값이 벡터로, 키가 이름으로 있습니다. 먼저 PostalCode 열에있는 값의 벡터를 만들어 보겠습니다.

getpostalcode <-postal_df $ PostalCode

다음으로 State 열에서 이름을 추가합니다.

이름 (getpostalcode) <-postal_df $ State

이 명명 된 벡터를 조회 테이블로 사용 하려면 형식은 mylookupvector [ 'key']입니다.

따라서 Arkansas의 우편 번호를 얻는 방법은 다음과 같습니다.

getpostalcode [ 'Arkansas'] 

키없이 값만 원하면 unname반환 된 값에 함수를 추가합니다 .

unname (getpostalcode [ 'Arkansas'])

업데이트 : 형식을 사용하여 하나의 값만 가져올 수도 있습니다. getpostalcode[['Arkansas']]즉, unname(). Twitter를 통해 팁을 주신 Peter Harrison에게 감사드립니다. 그러나 Hadley Wickham은 이중 대괄호 형식이 하나의 값에만 작동한다고 지적합니다. 데이터 프레임에 새 열을 만드는 것과 같은 작업을 수행하는 경우 unname ()을 고수하십시오.

그게 전부입니다. 나는 이것이 다소 사소한 예라는 것을 알고 있지만 실제로 사용됩니다. 예를 들어 미국 인구 조사 데이터로 작업 할 때 필요한 FIPS 코드의 명명 된 벡터가 있습니다.

나는 상태의 데이터 프레임과 FIPS 코드로 시작했습니다 fipsdf(그 코드는 아래에 있습니다). 다음으로 getfips데이터 프레임의 fips 코드 열에서 라는 벡터를 만들고 상태를 이름으로 추가했습니다.

fipsdf <-rio :: import ( "data / FIPS.csv")

getfips <-fipsdf $ FIPS

이름 (getfips) <-fipsdf $ State

이제 매사추세츠에 대한 FIPS 코드를 원하면 getfips['Massachusetts']. 이름이없는 값만 얻기 위해 unname ()을 추가합니다 : unname(getfips['Massachusetts']).

계속 unname()사용해야 하는 것이 너무 성가신 경우 룩업 테이블에서 약간의 기능을 만들 수도 있습니다.

get_state_fips <-function (state, lookupvector = getfips) {

fipscode <-이름 없음 (lookupvector [상태])

반환 (fipscode)

}

여기에 내 기능에 대한 두 가지 인수가 있습니다. 하나는 내 "열쇠"이며이 경우에는 주 이름입니다. 다른 하나는 lookupvector기본적으로 내 getfips벡터입니다. 

이 기능을 어떻게 사용하는지 볼 수 있습니다. 하나의 인수, 상태 이름 : get_state_fips("New York").

다음과 같이 좀 더 일반적으로 보이는 함수를 만들 수 있습니다.

get_value <-function (mykey, mylookupvector) {

myvalue <-mylookupvector [mykey]

myvalue <-이름 (myvalue)

반환 (myvalue)

}

함수에 대한보다 일반적인 이름이 있습니다. get_value(); 보다 일반적인 첫 번째 인수 이름, mykey및 그 두 번째 인수는 mylookupvector기본값이 아닙니다.

그것은 내가 계속해서 해왔 던 것과 똑같은 일입니다. 검색 벡터에서 값을 얻은 lookupvector['key']다음 unname()함수 를 실행하는 것입니다. 그러나 그것은 모두 함수 안에 싸여 있습니다. 그래서 그것을 부르는 것이 조금 더 우아합니다.

내가 만든 명명 된 벡터와 함께이 함수를 사용할 수 있습니다. 여기에서는 Arkansas 및 getpostalcode벡터 :  get_value("Arkansas", getpostalcode).

R에서 쉽게 조회! 이름은 고유해야합니다. 은 반복 할 수 있지만 는 반복 할 수 없습니다 .

나는 몇 년 전에 Hadley Wickham의 Advanced R 책 에서이 아이디어를 처음 보았습니다 . 나는 여전히 그것을 많이 사용하고 당신도 도움이되기를 바랍니다.

우편 약어로 데이터 프레임을 생성하는 코드

postal_df <-data.frame (stringsAsFactors = FALSE,

State = c ( "Alabama", "Alaska", "Arizona", "Arkansas", "California",

"콜로라도", "코네티컷", "델라웨어", "플로리다", "조지아",

"하와이", "아이다 호", "일리노이", "인디아나", "아이오와", "캔사스",

"켄터키", "루이지애나", "메인", "메릴랜드", "매사추세츠",

"미시간", "미네소타", "미시시피", "미조리", "몬타나",

"네브라스카", "네바다", "뉴햄프셔", "뉴저지", "뉴 멕시코",

"뉴욕", "노스 캐롤라이나", "노스 다코타", "오하이오",

"오클라호마", "오레곤", "펜실베이니아", "로드 아일랜드", "사우스 캐롤라이나",

"사우스 다코타", "테네시", "텍사스", "유타", "버몬트",

"버지니아", "워싱턴", "웨스트 버지니아", "위스콘신", "와이오밍"),

우편 번호 = c ( "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA",

"HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD",

"MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ",

"NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD",

"TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY")

)

FIPS 코드로 데이터 프레임을 생성하는 코드

fipsdf <-data.frame (State = c ( "Alabama", "Alaska", "Arizona", "Arkansas",

"캘리포니아", "콜로라도", "코네티컷", "델라웨어", "플로리다",

"조지아", "하와이", "아이다 호", "일리노이", "인디애나", "아이오와",

"캔자스", "켄터키", "루이지애나", "메인", "메릴랜드", "매사추세츠",

"미시간", "미네소타", "미시시피", "미조리", "몬타나",

"네브라스카", "네바다", "뉴햄프셔", "뉴저지", "뉴 멕시코",

"뉴욕", "노스 캐롤라이나", "노스 다코타", "오하이오", "오클라호마",

"오레곤", "펜실베이니아", "로드 아일랜드", "사우스 캐롤라이나", "사우스 다코타",

"테네시", "텍사스", "유타", "버몬트", "버지니아", "워싱턴",

"웨스트 버지니아", "위스콘신", "와이오밍"), FIPS = c ( "01", "02",

"04", "05", "06", "08", "09", "10", "12", "13", "15", "16", "17",

"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28",

"29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",

"40", "41", "42", "44", "45", "46", "47", "48", "49", "50", "51",

"53", "54", "55", "56"), stringsAsFactors = FALSE)