组合多个列以创建单个变量
Combining Multiple Columns to Create a Single Variable
我正在使用记录受访者种族的数据集。响应记录在多个变量中,并且允许受访者选择一个以上。示例:
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
您将无法将数字存储为数字类型,并使用像“variable”这样的字符串 - 因此您可以选择。要么坚持使用种族标签(如上面的解决方案),要么将标签转换为数字,然后将数字转换为这些数字的字符串表示形式。这似乎有点笨拙,但如果你想这样做,方法如下:
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
这是一个基本的 R 选项 -
#Get the name of column with non-NA value
ethinicty <- names(df)[max.col(!is.na(df))]
#If there are more than 1 option selected change it to 'multiple'
ethinicty[rowSums(!is.na(df)) > 1] <- 'multiple'
ethinicty
#[1] "Black" "White" "Hispanic" "multiple"
我正在使用记录受访者种族的数据集。响应记录在多个变量中,并且允许受访者选择一个以上。示例:
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
您将无法将数字存储为数字类型,并使用像“variable”这样的字符串 - 因此您可以选择。要么坚持使用种族标签(如上面的解决方案),要么将标签转换为数字,然后将数字转换为这些数字的字符串表示形式。这似乎有点笨拙,但如果你想这样做,方法如下:
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
这是一个基本的 R 选项 -
#Get the name of column with non-NA value
ethinicty <- names(df)[max.col(!is.na(df))]
#If there are more than 1 option selected change it to 'multiple'
ethinicty[rowSums(!is.na(df)) > 1] <- 'multiple'
ethinicty
#[1] "Black" "White" "Hispanic" "multiple"