r - 组合多列以创建单个变量
问题描述
我正在使用记录受访者种族的数据集。响应记录在多个变量中,并且允许受访者选择多个变量。例子:
Black White Asian Hispanic
1 NA NA NA
NA 1 NA NA
NA NA NA 1
NA NA 1 1
^^^在最后一行,受访者会选择亚裔和西班牙裔。
我想做的是:
A)将这些列折叠成一个种族变量,不同的数字代表不同的种族(即,黑色为 1,白色为 2 等)
B)拥有它,以便报告多个列的任何人都被指定为“多个”。
我有点 R 新手,所以任何帮助将不胜感激!
解决方案
一种方法是将您的列名作为一列进行旋转,按受访者对值进行分组,然后删除 NA 值。然后只需选择每个组保留的种族值,必要时切换到“多个”。这是使用 tidyverse 的一种方法:
library(tidyverse)
df %>%
rownames_to_column("respondent") %>%
pivot_longer(-respondent) %>%
group_by(respondent) %>%
filter(!is.na(value)) %>%
summarise(eth = ifelse(n() == 1, name, "multiple"))
# A tibble: 4 x 2
respondent eth
<chr> <chr>
1 1 Black
2 2 White
3 3 Hispanic
4 4 multiple
您将无法使用“变量”之类的字符串将数字存储为数字类型 - 因此您可以选择。要么坚持种族标签(如上面的解决方案),要么将标签转换为数字,然后将数字转换为这些数字的字符串表示形式。这似乎有点笨拙,但如果你想这样做,方法如下:
df %>%
rownames_to_column("respondent") %>%
pivot_longer(-respondent) %>%
mutate(eth_num = as.character(as.numeric(fct_inorder(name)))) %>%
group_by(respondent) %>%
filter(!is.na(value)) %>%
summarise(eth = ifelse(n() == 1, eth_num, "multiple"))
# A tibble: 4 x 2
respondent eth
<chr> <chr>
1 1 1
2 2 2
3 3 4
4 4 multiple
推荐阅读
- database - 如何连接一个数据库与多个窗口应用程序?
- php - 使用自定义 (ACF) 字段创建自定义查询以在 Wordpress 中显示关系数据
- c# - 在 linq 到 sql 连接上出现错误“不支持此服务器版本。只有最高 microsoft sql server 2005 的服务器”?
- android - 使用 Retrofit 解析 JSON
- c++ - 如何在 c++ 中使用 x 和 y 值找到圆和矩形的计算几何?
- java - Java 从 Youtube 播放列表中获取所有链接
- html - 制作字体真棒图标圈
- android - Dagger 提供依赖于活动视图的依赖项
- mysql - LEFT JOIN 3 tables with GROUP BY and SUM
- python - 如何从数据库模式自动生成示例 Django 应用程序?