【发布时间】:2019-03-18 13:57:14
【问题描述】:
我希望有人可以帮助我,因为我目前使用 grepl 的方法没有任何效果
我有几个类别(存储为字符)。我现在想构建一个变量,为不同的类别采用不同的值。
数据如下所示
category
Candidate Biography
Candidate Biography
Candidate Biography
Candidate Biography, Campaign Finance
Justice, Candidate Biography, Economy
Candidate Biography, Jobs
Economy, Education, Candidate Biography
Economy, Civil Rights, Candidate Biography
现在我想创建可以根据类别取不同值的新变量,如下所示
category CandBio Economy CivilRights Family
Candidate Biography 1 0 0 0
Candidate Biography 1 0 0 0
Candidate Biography 1 0 0 0
Candidate Biography, Campaign Finance 0.5 0.5 0 0
Justice, Candidate Biography, Economy 0.33 0.33 0.33 0
Candidate Biography, Jobs 0.5 0.5 0 0
Economy, Education, Candidate Biography 0.33 0.33 0 0.33
Economy, Civil Rights, Candidate Biography 0.33 0.33 0.33 0
每个类别对每个变量都有一个特定的因素(并且可以加载到不同的类别上)。例如。 CandBio 和 Economy 上的“候选人传记,竞选财务”各加载 0.5。对于数据集中的许多观察,类别会重新出现。 (在示例中,总共 49k obs 有 120 个不同类别,需要聚合成 10 个变量,例如 CandBio、Economy、CivilRights 等)
我第一次尝试结合 ifelse 和 grepl,但我意识到 grepl 对顺序非常敏感,并且我可以根据我的 ifelse 结构获得每个类别的故障分类。此外,我尝试获取具有相似数字的所有类别术语的向量,然后将向量包含在 grepl 函数中,但这也不起作用。
所以我正在寻找任何可以帮助我根据类别文本将权重分配给变量的解决方案。
我希望我能清楚地描述我的问题,并期待任何帮助,非常感谢!非常感谢!
编辑:到目前为止,我尝试过这种方式,但没有成功:
clintontvad$CandidateBiography <- ifelse(ifelse(grepl("Candidate Biography", clintontvad$subjects),1,
ifelse(grepl("Candidate Biography, Marriage, Gays and Lesbians, Civil Rights, Immigration, Trade, Energy, Workers", clintontvad$subjects), 0.125,
ifelse(grepl("Candidate Biography, Terrorism, Islam, Foreign Policy, Nuclear, Iran", clintontvad$subjects),0.17,
ifelse(grepl("Children, Candidate Biography, Families, Education, Debt, Economy, Jobs", clintontvad$subjects),0.17,
ifelse(grepl("Candidate Biography, Children, Education, Health Care, Women", clintontvad$subjects), 0.2,
ifelse(grepl("Candidate Biography, Civil Rights, Islam, Gays and Lesbians, Women", clintontvad$subjects), 0.2,
ifelse(grepl("Candidate Biography, Economy, Election, Children, Families", clintontvad$subjects), 0.2,
ifelse(grepl("Children, Education, Women, Economy, Families", clintontvad$subjects), 0.2,
ifelse(grepl("Job Accomplishments, Abortion, Women, Health Care, Climate Change, Marriage", clintontvad$subjects), 0.2,
ifelse(grepl("Women, Civil Rights, Gays and Lesbians, Foreign Policy, Canddate Biography", clintontvad$subjects), 0.25,
ifelse(grepl("Poverty, Health Care, Candidate Biography, Terrorism", clintontvad$subjects), 0.25,
ifelse(grepl("Job Accomplishments, Foreign Policy, Health Care, Children", clintontvad$subjects), 0.25,
ifelse(grepl("Foreign Policy, Terrorism, Candidate Biography", clintontvad$subjects),0.25,
ifelse(grepl("Ethics, Terrorism, Candidate Biography", clintontvad$subjects),0.25, 0)))))))))))))
【问题讨论】:
-
我不完全遵循您的逻辑,但我可以建议您不要以这种 CSV 格式存储您的类别,这种格式是非规范化的,因此使用起来很棘手。相反,请考虑将每个类别放在单独的一行。
-
假设您有类别 A、B、D、F、C(故意无序)。负载总是均匀分布吗?
-
Thx... 基本上我想要的是一个变量为特定的字符串或字符串组合采用特定的值。不同的字符串或字符串组合可以导致相同的值。我想 grepl 不是最好的解决方案,我还能做些什么来使变量为特定字符串取特定值?如果出现“ABD、ACE、YXZ”、“DEF”或“DAB、EDF”,则如果出现“ABD、DAB”或“XYZ”,则 Var1 取 0.33 如果出现“ABD”,则 VAR1 取变量 0.5 VAR1 取值 1还有 0 个。
-
首先,您应该创建一个表示您想要的映射的数据结构,例如,
myvars = list(CandBio = "Candidate Biography", Economy = c("Economy", "Campaign Finance"))从那里,我认为其他人可以更直接地帮助编码。
标签: r if-statement character grepl