עשו יותר עם R: טבלאות בדיקה מהירה באמצעות וקטורים בעלי שם

מה הקיצור הממלכתי של ארקנסו? האם זה AR? AK? כפי ש?

אולי יש לך מסגרת נתונים עם המידע. או כל מידע שיש בו עמודה אחת עם קטגוריות, ועמודה אחרת עם ערכים. רוב הסיכויים הם שבשלב מסוים תרצו לחפש את הערך לפי קטגוריות, המכונה לפעמים המפתח . להרבה שפות תכנות יש דרכים לעבוד עם צמדי ערך מפתח. קל לעשות זאת גם ב- R עם וקטורים בעלי שם. כך.

יש לי נתונים עם שמות מדינה וקיצורים, אותם שמרתי במסגרת נתונים בשם postal_df. (הקוד ליצירת מסגרת הנתונים נמצא בתחתית פוסט זה אם תרצה לעקוב אחריו).

אני ארוץ tail(postal_df)לראות איך זה נראה.

 מיקוד מדינת 45 ורמונט VT 46 וירג'יניה VA 47 וושינגטון וושינגטון 48 מערב וירג'יניה WV 49 ויסקונסין וויליאו וי.

לטבלת חיפוש / וקטור בשם יש ערכים כווקטור, ומפתחות כשמות. אז תן לי קודם לעשות וקטור של הערכים שנמצאים בעמודה PostalCode:

getpostalcode <- postal_df $ PostalCode

ובהמשך אני מוסיף שמות מהעמודה 'מדינה'.

שמות (getpostalcode) <- postal_df $ מדינה

כדי להשתמש בווקטור בשם זה כטבלת בדיקה, הפורמט הוא mylookupvector ['מפתח'].

אז הנה איך להשיג את המיקוד לארקנסו:

getpostalcode ['ארקנסו'] 

אם אתה רוצה רק את הערך, בלי המפתח, הוסף את unnameהפונקציה לערך שאתה מקבל בחזרה:

unname (getpostalcode ['Arkansas'])

עדכון: ניתן גם לקבל רק ערך אחד באמצעות הפורמט getpostalcode[['Arkansas']]- כלומר סוגריים כפולים במקום להוסיף 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 <- פונקציה (state, lookupvector = getfips) {

fipscode <- unname (lookupvector [state])

החזר (fipscode)

}

הנה, יש לי שני טיעונים לתפקוד שלי. האחד הוא ה"מפתח "שלי, במקרה זה שם המדינה; האחר הוא lookupvectorברירת המחדל getfipsלווקטור שלי . 

ואתה יכול לראות איך אני משתמש בפונקציה. זה פשוט שם הפונקציה עם ארגומנט אחד, בשם המדינה: get_state_fips("New York").

אני יכול לעשות פונקציה שנראית קצת יותר גנרית, כגון

get_value <- פונקציה (mykey, mylookupvector) {

myvalue <- mylookupvector [mykey]

myvalue <- unname (myvalue)

החזר (myvalue)

}

יש לו שם כללי יותר לפונקציה , get_value(); שם טיעון ראשון כללי יותר mykey, וטיעון שני של mylookupvectorזה אינו ברירת מחדל לשום דבר.

זה אותו הדבר שעשיתי לאורך כל הדרך: לקבל את הערך מווקטור החיפוש lookupvector['key']ואז להפעיל את unname()הפונקציה. אבל הכל עטוף בפונקציה. אז לקרוא לזה זה קצת יותר אלגנטי.

אני יכול להשתמש בפונקציה הזו עם כל וקטור בשם שיצרתי. הנה, אני משתמש בו עם ארקנסו שלי getpostalcodeוקטור:  get_value("Arkansas", getpostalcode).

חיפושים קלים ב- R! רק זכרו ששמות צריכים להיות ייחודיים. אתה יכול לחזור על ערכים , אך לא על מקשים .

את הרעיון הזה ראיתי לראשונה לפני שנים בספר R מתקדם של הדלי וויקהאם . אני עדיין משתמש בה הרבה ומקווה שתמצא את זה גם מועיל.

קוד ליצירת מסגרת נתונים עם קיצורי דואר

postal_df <- data.frame (stringsAsFactors = FALSE,

מדינה = c ("אלבמה", "אלסקה", "אריזונה", "ארקנסו", "קליפורניה",

"קולורדו", "קונטיקט", "דלאוור", "פלורידה", "ג'ורג'יה",

"הוואי", "איידהו", "אילינוי", "אינדיאנה", "איווה", "קנזס",

"קנטקי", "לואיזיאנה", "מיין", "מרילנד", "מסצ'וסטס",

"מישיגן", "מינסוטה", "מיסיסיפי", "מיזורי", "מונטנה",

"נברסקה", "נבאדה", "ניו המפשייר", "ניו ג'רזי", "ניו מקסיקו",

"ניו יורק", "צפון קרוליינה", "צפון דקוטה", "אוהיו",

"אוקלהומה", "אורגון", "פנסילבניה", "רוד איילנד", "דרום קרוליינה",

"דרום דקוטה", "טנסי", "טקסס", "יוטה", "ורמונט",

"וירג'יניה", "וושינגטון", "מערב וירג'יניה", "ויסקונסין", "ויומינג"),

PostalCode = 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)