我是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+开始)。
你会建议一种方法来帮我解决这个问题吗?非常感谢你的帮助!
答案 0 :(得分:0)
假设你想检查一下" countrycodes"的子集。每个国家/地区都有#34;变量,条件是如果至少有一个"国家代码"存在于特定行中,该行将得到" 1",否则" 0"。我们的想法是创建一个" countrycodes"的向量(v1
)。需要检查。删除" id"将数据集(df
)转换为矩阵。列(as.matrix(df[,-1])
)然后通过与" v1"进行比较来创建逻辑向量(%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
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))