我们需要使用 lapply 代替 sapply 因为后者转换为 matrix 矩阵只能容纳一个类。如果有任何字符列,则所有列都将转换为 character 。当我们使用 as.data.frame ,这会转换为 factor 作为默认选项是 stringsAsFactors=TRUE 。
lapply
sapply
matrix
character
as.data.frame
factor
stringsAsFactors=TRUE
g <- lapply(df, function(x) { tmp = lookup[, 2][match(x, lookup[, 1])] ifelse(is.na(tmp), x, tmp) }) df2 <- data.frame(g) str(df2) #'data.frame': 20 obs. of 5 variables: # $ year : num 2008 2008 2008 2010 2009 ... # $ change_occurred: Factor w/ 2 levels "false","true": 2 1 2 1 1 2 1 1 1 1 ... # $ agent_01 : Factor w/ 5 levels "agriculture",..: 3 5 2 5 5 1 5 5 5 5 ... # $ agent_01_conc : Factor w/ 5 levels "agriculture",..: 3 5 2 5 5 1 5 5 5 5 ... # $ ha_affect : num 3.87 0 1.13 0 0 ...
如果我们真的想用 sapply ,那就有一个选择 simplify=FALSE 所以它不会强迫 matrix 。
simplify=FALSE