-2

我是 R 新手,在这个网站上找不到我的问题的具体帮助。

我的数据框 $grant_database、country_1 到 country_10 中有(除其他外)十个字符变量。每个都包含一个国家代码,例如 E20、F27 或 G10,或者一个 NA。每个案例都是对项目的资助。十个国家变量指定赠款受益的国家/地区。在我的数据框中,大多数(但并非所有)案例都会有至少一个国家代码,首先在 country_1 中进行标记,许多情况下也会有一个用于 country_2,有些甚至是用于 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+ 开始)。

你会通过建议一种编程方法来帮助我吗?非常感谢您的帮助!

4

1 回答 1

0

假设您想检查每个“国家/地区”变量中是否存在“国家/地区代码”的子集,条件是如果特定行中至少存在一个“国家/地区代码”,则该行将获得“1”,否则为“0”。这个想法是创建一个v1需要检查的“国家代码”向量 ( )。df删除“id”列( )后将数据集( )转换为矩阵as.matrix(df[,-1]),然后通过与“v1”(%in%)进行比较来创建逻辑向量。dim<-通过将维度 ( )分配给df[,-1]ie ( ) 的维度,可以将向量改回“矩阵” 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

新数据

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))
于 2015-01-05T15:22:10.210 回答