【问题标题】:How do I map values to a list of values in a data frame R如何将值映射到数据框 R 中的值列表
【发布时间】:2020-08-26 15:50:42
【问题描述】:

目前我有一个基于状态分段的数据框,例如:

  STATE     
1 Connecticut
2 Maine
3 New York
4 Pennsylvania

我希望能够根据地区对这些州进行细分,并希望有一个基于此的列:

  STATE        REGION
1 Connecticut  New England
2 Maine        New England
3 New York     Mid-Atlantic
4 Pennsylvania Mid-Atlantic

目前,我有这个:

ne <- c("Connecticut", "Maine", "Massachusetts", "New Hampshire", "Rhode Island", "Vermont")
values <- c("New England")
df$REGION <- values[match(jails_cleaned$STATE, ne)]

midatlantic <- c("New Jersey", "New York", "Pennsylvania")
values2 <- c("Mid-Atlantic")
df$REGION <- values[match(df$STATE, midatlantic)]

但是在运行这个时,它只匹配新英格兰的值而不是中大西洋。

【问题讨论】:

    标签: r dataframe dictionary


    【解决方案1】:

    创建一个数据框,您将 merge 到您的 jails_cleaned 数据

    df_stats <- data.frame(
      'STATE' = c(
        c("Connecticut", "Maine", "Massachusetts", "New Hampshire", "Rhode Island", "Vermont"),
        c("New Jersey", "New York", "Pennsylvania")),
      'REGION' = c(rep("New England",6), rep("Mid-Atlantic",3))
    )
    
    df_stats
              STATE       REGION
    1   Connecticut  New England
    2         Maine  New England
    3 Massachusetts  New England
    4 New Hampshire  New England
    5  Rhode Island  New England
    6       Vermont  New England
    7    New Jersey Mid-Atlantic
    8      New York Mid-Atlantic
    9  Pennsylvania Mid-Atlantic
    
    merge(jails_cleaned,df_stats, by = 'STATE')
    

    更新

    如果要执行左连接,即保留jails_cleaned 的每一行,请使用all.x = TRUE 参数

    merge(jails_cleaned,df_stats, by = 'STATE', all.x = TRUE)
    

    【讨论】:

    • 当我考虑每个区域并将其与包含 841 行的 jails_cleaned 数据帧合并时,输出仅返回 98 行数据,不考虑某些州/地区
    • 这是因为merge 默认执行一个内连接。添加all.x = TRUE 以执行左连接(请参阅更新)
    • 嗨,很抱歉所有问题!我最初执行了您上面列出的操作并创建了 df_stats,这是一个具有 51 行的数据框(对于每个州 + DC,以及相应的区域)。但是,当我使用左连接进行合并时,许多区域会输出为 NA 值。
    • 你有一些(或几件事)会引起不匹配。要进行调查,您可以执行jails_cleaned[!(jails_cleaned$STATE %in% df_stats$STATE), ] 和df_stats[!(df_stats$STATE %in% jails_cleaned$STATE), ] 并查看不匹配的键。例如,大写字母的问题?
    • 您也可以使用data.table 执行anti-join。它更强大,但它是更高级的实践(参见here)
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2020-08-25
    • 2020-06-21
    • 2016-06-04
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多