R:将几个字符重新编码为一个新因素
R: Recoding several characters into one new factor
我是 R 的新手,在此站点上找不到针对我的问题的具体帮助。
我的数据框 $grant_database、country_1 到 country_10 中有(除其他外)十个字符变量。每个都包含一个国家代码,例如 E20、F27 或 G10,或一个 NA。每个案例都是对一个项目的资助。十个国家/地区变量指定 country/countries 赠款受益。在我的数据框中,大多数但不是所有情况都会有至少一个国家代码,首先在 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
...
我希望创建一个新的因素来标记赠款,使特定的国家/地区受益。此二进制 "dummy" 变量应为十个国家变量中至少有一个与国家代码列表相对应的每种情况赋予值“1”。它应该为每个 case/grant 在其十个国家/地区变量中没有相应国家/地区代码的每个国家/地区代码赋值“0”。让这个要标记的国家代码子集为:E20、F27 和 G10(实际上,大约有 40 个要标记,从 150+)。
你能帮我推荐一种编程方法吗?非常感谢您的帮助!
假设您想检查每个 "country" 变量中是否存在 "countrycodes" 的子集,条件是如果 "countrycode" 中至少有一个存在于特定行,该行将获得“1”,否则为“0”。这个想法是创建一个需要检查的 "countrycodes" 向量 (v1
)。在删除 "id" 列 (as.matrix(df[,-1])
) 后将数据集 (df
) 转换为矩阵,然后通过与 "v1" (%in%
) 进行比较来创建逻辑向量。通过将维度 (dim<-
) 分配给 df[,-1]
的维度,即 (c(5,7)
),可以将向量改回 "matrix"。做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))
我是 R 的新手,在此站点上找不到针对我的问题的具体帮助。
我的数据框 $grant_database、country_1 到 country_10 中有(除其他外)十个字符变量。每个都包含一个国家代码,例如 E20、F27 或 G10,或一个 NA。每个案例都是对一个项目的资助。十个国家/地区变量指定 country/countries 赠款受益。在我的数据框中,大多数但不是所有情况都会有至少一个国家代码,首先在 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
...
我希望创建一个新的因素来标记赠款,使特定的国家/地区受益。此二进制 "dummy" 变量应为十个国家变量中至少有一个与国家代码列表相对应的每种情况赋予值“1”。它应该为每个 case/grant 在其十个国家/地区变量中没有相应国家/地区代码的每个国家/地区代码赋值“0”。让这个要标记的国家代码子集为:E20、F27 和 G10(实际上,大约有 40 个要标记,从 150+)。
你能帮我推荐一种编程方法吗?非常感谢您的帮助!
假设您想检查每个 "country" 变量中是否存在 "countrycodes" 的子集,条件是如果 "countrycode" 中至少有一个存在于特定行,该行将获得“1”,否则为“0”。这个想法是创建一个需要检查的 "countrycodes" 向量 (v1
)。在删除 "id" 列 (as.matrix(df[,-1])
) 后将数据集 (df
) 转换为矩阵,然后通过与 "v1" (%in%
) 进行比较来创建逻辑向量。通过将维度 (dim<-
) 分配给 df[,-1]
的维度,即 (c(5,7)
),可以将向量改回 "matrix"。做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))