我目前正在处理一项调查的原始数据导出.我目前正处于清理阶段,一些人口统计变量的 struct 方式不利于分析.具体地说,受访者可以 Select 多个种族选项,数据导出中的外观如下所示:

enter image description here

以下是复制数据集的代码:

ID <- c(rep(c(1:8), 1))
White <- c("White",NA,NA,NA,NA,NA,"White","White")
Asian <- c(NA,NA,NA,NA,NA,"Asian",NA,"Asian")
SouthAfrican <- c(NA,"SouthAfrican",NA, NA,NA, NA, NA, "SouthAfrican")
Hispanic <- c(NA, NA, NA, NA, "Hispanic", "Hispanic", NA, NA)
WestAsian <- c(NA, NA, NA, NA, NA, NA, "WestAsian", NA)
PreferNotToAnswer <- c(NA, NA,"PreferNotToAnswer", "PreferNotToAnswer", NA, NA, NA, NA)

df <- data.frame(ID, White, Asian, SouthAfrican, Hispanic, WestAsian, PreferNotToAnswer)

我想要做的是找到一种方法,创建一个"Race"列,并将单独列中的值合并到那个Race变量中.如果受访者 Select 了多个选项作为他们的种族(即,ID 8),我想要找到一种方法来将该受访者的种族变量编码为"混合".

所以我想要的结果是:

ID <- c(rep(c(1:8), 1))
White <- c("White",NA,NA,NA,NA,NA,"White","White")
Asian <- c(NA,NA,NA,NA,NA,"Asian",NA,"Asian")
SouthAfrican <- c(NA,"SouthAfrican",NA, NA,NA, NA, NA, "SouthAfrican")
Hispanic <- c(NA, NA, NA, NA, "Hispanic", "Hispanic", NA, NA)
WestAsian <- c(NA, NA, NA, NA, NA, NA, "WestAsian", NA)
PreferNotToAnswer <- c(NA, NA,"PreferNotToAnswer", "PreferNotToAnswer",NA, NA, NA, NA)
Race <- c("White","SouthAfrican","PreferNotToAnswer", "PreferNotToAnswer","Hispanic", "Mixed", "Mixed", "Mixed")

df <- data.frame(ID, White, Asian, SouthAfrican, Hispanic,WestAsian,PreferNotToAnswer,Race)

推荐答案

vector中,定义人口统计变量,然后创建一个布尔m矩阵,然后查找which.max以确定您的向量的子集.最后,replace多个答案,其中rowSums大于1,并将其输送到另一个replace以处理具有NA的非答案(否则将缺省为第一个元素,即在本例中为白色).

v <- c("White", "Asian", "SouthAfrican", "Hispanic", "WestAsian", "PreferNotToAnswer")
m <- !is.na(df[v])
df$race <- replace(v[apply(m, 1, which.max)], rowSums(m) > 1, 'mixed') |>
  replace(rowSums(m) == 0, NA_character_)
#   ID White Asian SouthAfrican Hispanic WestAsian PreferNotToAnswer              race
# 1  1 White  <NA>         <NA>     <NA>      <NA>              <NA>             White
# 2  2  <NA>  <NA> SouthAfrican     <NA>      <NA>              <NA>      SouthAfrican
# 3  3  <NA>  <NA>         <NA>     <NA>      <NA> PreferNotToAnswer PreferNotToAnswer
# 4  4  <NA>  <NA>         <NA>     <NA>      <NA> PreferNotToAnswer PreferNotToAnswer
# 5  5  <NA>  <NA>         <NA> Hispanic      <NA>              <NA>          Hispanic
# 6  6  <NA> Asian         <NA> Hispanic      <NA>              <NA>             mixed
# 7  7 White  <NA>         <NA>     <NA> WestAsian              <NA>             mixed
# 8  8 White Asian SouthAfrican     <NA>      <NA>              <NA>             mixed

请注意,这应该比任何try 按行删除NA的方法快much.

R相关问答推荐

在ggplot的注释表格中突出显示最大值

使用R中的Shapetime裁剪格栅文件

咕噜中的元素列表:map

如何计算R数据集中每个女性的子元素数量?

如何改变x轴比例的列在面

在R中按行按列范围查找最大值的名称

仅 Select 超过9行的CSV文件

Data.table';S GForce-将多个函数应用于多列(带可选参数)

R-按最接近午夜的时间进行筛选

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

如何计算R glm probit中的线性预测因子?

无法将条件case_when()应用于使用!!创建的新变量Mutations

以任意顺序提取具有多个可能匹配项的组匹配项

用满足特定列匹配的另一行替换NA行

具有自定义仓位限制和计数的GGPLATE直方图

从矩阵创建系数图

R,将组ID分配给另一个观测ID变量中的值的组合

为什么R列名称忽略具有指定名称的向量,而只关注索引?

如何在R曲线图弹出窗口中更改r和theta标签