R 基于同一行中的其他值选择值
我有一个数据帧df,其中有colums日期、赢家、输家、Winnerrak和Loserrank。winnerrank是列获胜者的等级,loserrank也是如此。 我想有一个新的数据框,包含日期、名称和等级。但问题是我想要的名字可以同时出现在哥伦布,赢家和输家。如果我想要的名字在winner栏中,我想要Winnerrank,但是如果名字在Loser栏中,我想要loserrank。我该怎么做 df如下所示:R 基于同一行中的其他值选择值,r,R,我有一个数据帧df,其中有colums日期、赢家、输家、Winnerrak和Loserrank。winnerrank是列获胜者的等级,loserrank也是如此。 我想有一个新的数据框,包含日期、名称和等级。但问题是我想要的名字可以同时出现在哥伦布,赢家和输家。如果我想要的名字在winner栏中,我想要Winnerrank,但是如果名字在Loser栏中,我想要loserrank。我该怎么做 df如下所示: Date Winner Loser WRan
Date Winner Loser WRank LRank
1 2000-01-03 Federer R. Knippschild J. 65 87
2 2000-01-03 Enqvist T. Federer R. 5 65
3 2000-01-10 Ferrero J.C. Federer R. 45 61
4 2000-01-17 Federer R. Chang M. 62 38
5 2000-01-17 Federer R. Kroslak J. 62 104
6 2000-01-17 Clement A. Federer R. 54 62
Date Name Rank
1 2000-01-03 Federer R. 65
2 2000-01-03 Federer R. 65
3 2000-01-10 Federer R. 61
4 2000-01-17 Federer R. 62
5 2000-01-17 Federer R. 62
6 2000-01-17 Federer R. 62
我想要的格式如下所示:
Date Winner Loser WRank LRank
1 2000-01-03 Federer R. Knippschild J. 65 87
2 2000-01-03 Enqvist T. Federer R. 5 65
3 2000-01-10 Ferrero J.C. Federer R. 45 61
4 2000-01-17 Federer R. Chang M. 62 38
5 2000-01-17 Federer R. Kroslak J. 62 104
6 2000-01-17 Clement A. Federer R. 54 62
Date Name Rank
1 2000-01-03 Federer R. 65
2 2000-01-03 Federer R. 65
3 2000-01-10 Federer R. 61
4 2000-01-17 Federer R. 62
5 2000-01-17 Federer R. 62
6 2000-01-17 Federer R. 62
我们可以使用tidyverse软件包中的函数:
需要注意的一点是,这将把您的排名转换为字符值。您可以使用as.numeric函数来逆转这种情况。函数可能有助于根据播放器名称提取这些行和值。我们过滤球员姓名在“赢家”或|“输家”列中的行,然后使用transmute通过选择“日期”、“姓名”作为输入球员姓名创建三列输出,并通过比较列“赢家”、“输家”与球员姓名的子集创建逻辑矩阵创建“排名”,将该输出馈送到max.col中,以获得每行的最大值索引,即TRUE=>1和FALSE=>0,cbind具有行索引row_编号,并使用该编号从具有“WRank”、“LRank”列的数据集子集中提取相应的元素
f1 <- function(dat, nm) {
dat %>%
filter(Winner == nm|Loser == nm) %>%
transmute(Date, Name = nm,
Rank = .[c('WRank', 'LRank')][cbind(row_number(),
max.col(.[c('Winner', 'Loser')] == nm))])
}
数据
您可以将赢家和输家合并在一列中,并将其排名在一列中,然后选择玩家名称
library(dplyr)
player_name <- 'Federer R.'
df %>%
rename_with(~paste0(., '_Name'), c(Winner, Loser)) %>%
rename_with(~paste0(., '_Rank'), ends_with('Rank')) %>%
tidyr::pivot_longer(cols = -Date,
names_pattern = '.*_(\\w+)',
names_to = '.value') %>%
filter(Name == player_name)
# Date Name Rank
# <chr> <chr> <int>
#1 2000-01-03 Federer R. 65
#2 2000-01-03 Federer R. 65
#3 2000-01-10 Federer R. 61
#4 2000-01-17 Federer R. 62
#5 2000-01-17 Federer R. 62
#6 2000-01-17 Federer R. 62
你不需要%>%filterName=='Federer.'来获得预期的结果吗?如果不先将每一组名字和等级联合起来,就不可能将它们旋转得更长吗?这样可以避免数字/字符转换。
library(dplyr)
player_name <- 'Federer R.'
df %>%
rename_with(~paste0(., '_Name'), c(Winner, Loser)) %>%
rename_with(~paste0(., '_Rank'), ends_with('Rank')) %>%
tidyr::pivot_longer(cols = -Date,
names_pattern = '.*_(\\w+)',
names_to = '.value') %>%
filter(Name == player_name)
# Date Name Rank
# <chr> <chr> <int>
#1 2000-01-03 Federer R. 65
#2 2000-01-03 Federer R. 65
#3 2000-01-10 Federer R. 61
#4 2000-01-17 Federer R. 62
#5 2000-01-17 Federer R. 62
#6 2000-01-17 Federer R. 62