我有一个数据框,其中包含两个感兴趣的变量:一个字符变量,它是每个obs的状态缩写,以及每个obs的区域代码 . 我还有一个列表,它将一组可接受的区域代码与每个州相关联 .
df <- data.frame(state=c("AL","CO","DE","TX"), region=c(1,2,3,4))
acceptable_regions <- list(AL=c(1,2), CO=1, DE=c(2,3), TX=(1:4))
我想创建一个虚拟变量,如果该区域包含在可接受代码集中,则分配“0”,否则为“1” . 我的第一个想法是使用ifelse()但我得到一个错误,递归索引在2级失败 .
df$far_away <- ifelse(df$region %in% acceptable_regions[[df$state]], 0,1)
我原以为ifelse会认识到我想通过df $状态进行索引,因为 acceptable_regions[[df$state[i]]
可以独立工作 .
如何根据变量“state”的值拉出我想要的列表元素?当然要尽量避免循环 .
1 回答
我们可以使用
map2
(来自purrr
)循环'state'和'region'的相应值,从'state'的值中提取'acceptable_region'的list
元素,检查是否%in%
'region'得到逻辑vector
,用as.integer
将其强制转换为二进制或者使用
rowwise
或者使用
base R
,使用Map