对 R 中的多列使用相同的因子映射
Using the same factor mapping for multiple columns in R
我正在尝试弄清楚如何对多个列使用相同的因子 "mapping"。
例如,这是一个虚拟网球比赛的数据集,其中一名球员是热门球员,另一名球员是弱者:
df <- tribble(
~game, ~favorite, ~underdog,
#-----|----------|----------
1, "Mary", "Susan",
2, "Susan", "John",
3, "Mary", "Joe",
4, "Joe", "Dave",
5, "Susan", "Dave"
)
请注意,有些宠儿永远不会处于劣势(玛丽),而处于劣势的人永远不会成为宠儿(约翰、戴夫)。
我想创建一个适用于最受欢迎和失败列的因素。例如,如果我现在输入
df %<>% mutate(favorite=factor(favorite))
然后 Joe 是 1,Mary 是 2,Susan 是 3,因为默认是按字母顺序排列。
我现在如何将失败者列更改为一个因素,以便每次乔出现在那里时,他都被分配 1,玛丽得到 2,依此类推?
我的requirements/hopes/desires:
- 实际上会有很多行和不同的条目,所以手工编码不是一种选择;
- 我希望能够在链的中间使用管道执行此操作;
- 最后,我希望能够 运行 像
filter(favorite=="Susan" | underdog=="Susan")
这样的代码。
我看了看,但找不到以前在哪里做过这件事。任何帮助将不胜感激。
我们可以指定levels
library(dplyr)
df%>%
mutate(favorite = factor(favorite, levels = unique(underdog)))
如果我们需要两列都是 factor
,请使用 mutate_at
df %>%
mutate_at(vars(favorite, underdog), ~ factor(., levels = unique(underdog)))
您可以获得 unique
名玩家,然后将其用作两列的 factor
等级。
unique_players <- unique(unlist(df[-1]))
df[-1] <- lapply(df[-1], factor, levels = unique_players)
df[-1]
# A tibble: 5 x 2
# favorite underdog
# <fct> <fct>
#1 Mary Susan
#2 Susan John
#3 Mary Joe
#4 Joe Dave
#5 Susan Dave
如果是管道的话
library(dplyr)
df <- df %>% mutate_at(-1, factor, levels = unique_players)
因此,如果您将其转换为数字,相似的名称将具有相同的数字。
sapply(df[-1], as.numeric)
# favorite underdog
#[1,] 1 2
#[2,] 2 4
#[3,] 1 3
#[4,] 3 5
#[5,] 2 5
我正在尝试弄清楚如何对多个列使用相同的因子 "mapping"。
例如,这是一个虚拟网球比赛的数据集,其中一名球员是热门球员,另一名球员是弱者:
df <- tribble(
~game, ~favorite, ~underdog,
#-----|----------|----------
1, "Mary", "Susan",
2, "Susan", "John",
3, "Mary", "Joe",
4, "Joe", "Dave",
5, "Susan", "Dave"
)
请注意,有些宠儿永远不会处于劣势(玛丽),而处于劣势的人永远不会成为宠儿(约翰、戴夫)。
我想创建一个适用于最受欢迎和失败列的因素。例如,如果我现在输入
df %<>% mutate(favorite=factor(favorite))
然后 Joe 是 1,Mary 是 2,Susan 是 3,因为默认是按字母顺序排列。
我现在如何将失败者列更改为一个因素,以便每次乔出现在那里时,他都被分配 1,玛丽得到 2,依此类推?
我的requirements/hopes/desires:
- 实际上会有很多行和不同的条目,所以手工编码不是一种选择;
- 我希望能够在链的中间使用管道执行此操作;
- 最后,我希望能够 运行 像
filter(favorite=="Susan" | underdog=="Susan")
这样的代码。
我看了看,但找不到以前在哪里做过这件事。任何帮助将不胜感激。
我们可以指定levels
library(dplyr)
df%>%
mutate(favorite = factor(favorite, levels = unique(underdog)))
如果我们需要两列都是 factor
,请使用 mutate_at
df %>%
mutate_at(vars(favorite, underdog), ~ factor(., levels = unique(underdog)))
您可以获得 unique
名玩家,然后将其用作两列的 factor
等级。
unique_players <- unique(unlist(df[-1]))
df[-1] <- lapply(df[-1], factor, levels = unique_players)
df[-1]
# A tibble: 5 x 2
# favorite underdog
# <fct> <fct>
#1 Mary Susan
#2 Susan John
#3 Mary Joe
#4 Joe Dave
#5 Susan Dave
如果是管道的话
library(dplyr)
df <- df %>% mutate_at(-1, factor, levels = unique_players)
因此,如果您将其转换为数字,相似的名称将具有相同的数字。
sapply(df[-1], as.numeric)
# favorite underdog
#[1,] 1 2
#[2,] 2 4
#[3,] 1 3
#[4,] 3 5
#[5,] 2 5