R:将多个字符重新编码为一个新因子

时间:2015-01-05 14:58:15

标签: r dummy-data recode

我是R的新手,在本网站上找不到具体的帮助。

我的数据框$ grant_database,country_1到country_10中有十个字符变量(其中包括)。每个包含国家代码,例如E20,F27或G10,或NA。每个案例都是对项目的补助。十个国家变量规定了赠款受益的国家/国家/地区。在我的数据框架中,大多数但并非所有情况都至少有一个国家/地区代码,首先在country_1中标记,很多国家/地区也会有一个国家/地区代码,有些甚至是country_3到_10。所有空字段都标有NA。

id  country_1  country_2  country_3  country_4  country_5  country_6 ...new_binaryvar
1   F20        NA         NA         NA         NA         NA           0        
2   E12        E17        E52        NA         NA         NA           0
3   O62        O33        NA         NA         NA         NA           0
4   E21        E20        NA         NA         NA         NA           1
5   NA         NA         NA         NA         NA         NA           0
...

我希望创建一个标记授权的新因子,这有利于已定义的国家/地区子集。这个二进制"虚拟"变量应该给出值" 1"对于每种情况,在十个国家变量中的至少一个中对应于国家代码列表。它应该给" 0"对于在其十个国家/地区变量中没有相应国家/地区代码的每个案例/拨款。让这个国家代码子集标记为:E20,F27和G10(实际上,大约有40个被标记,从150+开始)。

你会建议一种方法来帮我解决这个问题吗?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

假设你想检查一下&#34; countrycodes&#34;的子集。每个国家/地区都有#34;变量,条件是如果至少有一个&#34;国家代码&#34;存在于特定行中,该行将得到&#34; 1&#34;,否则&#34; 0&#34;。我们的想法是创建一个&#34; countrycodes&#34;的向量(v1)。需要检查。删除&#34; id&#34;将数据集(df)转换为矩阵。列(as.matrix(df[,-1]))然后通过与&#34; v1&#34;进行比较来创建逻辑向量(%in%)。矢量可以改回&#34;矩阵&#34;通过将维度(dim<-)分配给df[,-1]的维度,即(c(5,7))。执行rowSums,双重否定(!!),最后添加0以获取二进制虚拟变量。

 v1 <- c('E20', 'F27', 'G10')
(!!rowSums(`dim<-`(as.matrix(df[,-1]) %in% v1, c(5,7))))+0
#[1] 0 0 0 1 0

newdata

df <- structure(list(id = 1:5, country_1 = c("F20", "E12", "O62", "E21", 
NA), country_2 = c(NA, "E17", "O33", "E20", NA), country_3 = c(NA, 
 "E52", NA, NA, NA), country_4 = c(NA, NA, NA, NA, NA), country_5 = c(NA, 
NA, NA, NA, NA), country_6 = c(NA, NA, NA, NA, NA), country_7 = c(NA, 
NA, NA, NA, NA)), .Names = c("id", "country_1", "country_2", 
"country_3", "country_4", "country_5", "country_6", "country_7"
 ), class = "data.frame", row.names = c(NA, -5L))