使用R中的查找表查找/替换或映射

使用R中的查找表查找/替换或映射,r,mapping,lookup,large-data,R,Mapping,Lookup,Large Data,完全是新手。请温柔一点 我在数据框中有一列,其中的数值表示种族(英国人口普查数据) 我可以进行映射(或查找/替换)以创建包含人类可读值的列(或编辑现有列): # map values one-to-one from numeric to string df$ethnicity <- mapvalues(df$ethnicode, from = c(8, 7, 6, 5, 4, 3, 2, 1, 0),

完全是新手。请温柔一点

我在数据框中有一列,其中的数值表示种族(英国人口普查数据)

我可以进行映射(或查找/替换)以创建包含人类可读值的列(或编辑现有列):

# map values one-to-one from numeric to string
df$ethnicity <- mapvalues(df$ethnicode, 
                             from = c(8, 7, 6, 5, 4, 3, 2, 1, 0), 
                             to = c("Other", "Black", "Asian", "Mixed", 
                                    "WhiteOther", "WhiteIrish", "WhiteUK", 
                                    "WhiteTotal", "All"))
关键是,如果我想更改人类可读的字符串,或者对流程执行任何其他操作,我宁愿对查找表执行一次,而不是在多个脚本中的多个位置执行一次。。。如果我能更有效地完成这项工作(900万行不超过20秒),那也会很好

我还想轻松地确保“8”仍然等于“其他”(或任何等效项),“0”仍然等于“全部”,等等,这在视觉上更加困难,因为使用上述方法的列表较长


提前感谢。

您可以为此使用命名向量。但是,您需要将人种代码转换为角色

df = data.frame(
    id = c(1, 2, 3, 4, 5, 6, 7, 8, 9), 
    ethnicode = as.character(c(0, 1, 2, 3, 4, 5, 6, 7, 8)), 
    stringsAsFactors=FALSE
)

# create lookup table
ethnicode = c(8, 7, 6, 5, 4, 3, 2, 1, 0) 
ethnicity = c("Other", "Black", "Asian", "Mixed", "WhiteOther", 
           "WhiteIrish", "WhiteUK", "WhiteTotal", "All")
lookup = setNames(ethnicity, as.character(ethnicode))
那你就可以了

df <- transform(df, ethnicity=lookup[ethnicode], stringsAsFactors=FALSE)

df谢谢,@Karsten W。我遇到的问题是,建议的解决方案似乎考虑了这个问题,好像它与示例数据帧有关,因此,我可以在创建它们时对它们进行修改,而不是将它们作为预先存在的数据帧(通过导入CSV创建)进行修改。我尝试将'as.character'和'stringsAsFactors'应用于各自数据帧中的相关列,以便使用'transform',但是,强制执行'character'需要几秒钟,并且'transform'始终挂起。针对大数据方面编辑了答案。很酷,谢谢。我将有一个小游戏,看看我如何去。
df = data.frame(
    id = c(1, 2, 3, 4, 5, 6, 7, 8, 9), 
    ethnicode = as.character(c(0, 1, 2, 3, 4, 5, 6, 7, 8)), 
    stringsAsFactors=FALSE
)

# create lookup table
ethnicode = c(8, 7, 6, 5, 4, 3, 2, 1, 0) 
ethnicity = c("Other", "Black", "Asian", "Mixed", "WhiteOther", 
           "WhiteIrish", "WhiteUK", "WhiteTotal", "All")
lookup = setNames(ethnicity, as.character(ethnicode))
df <- transform(df, ethnicity=lookup[ethnicode], stringsAsFactors=FALSE)
library(RSQLite)

dbname <- "big_data_mapping.db" # db to create
csvname <- "data/big_data_mapping.csv" # large dataset

ethn_codes = data.frame(
    ethnicode= c(8, 7, 6, 5, 4, 3, 2, 1, 0), 
    ethnicity= c("Other", "Black", "Asian", "Mixed", "WhiteOther", "WhiteIrish", "WhiteUK", "WhiteTotal", "All")
)

# build db
con <- dbConnect(SQLite(), dbname)
dbWriteTable(con, name="main", value=csvname, overwrite=TRUE)
dbWriteTable(con, name="ethn_codes", ethn_codes, overwrite=TRUE)

# join the tables
dat <- dbGetQuery(con, "SELECT main.id, ethn_codes.ethnicity FROM main JOIN ethn_codes ON main.ethnicode=ethn_codes.ethnicode")

# finish
dbDisconnect(con)
#file.remove(dbname)