R 基于同一行中的其他值选择值

R 基于同一行中的其他值选择值,r,R,我有一个数据帧df,其中有colums日期、赢家、输家、Winnerrak和Loserrank。winnerrank是列获胜者的等级,loserrank也是如此。 我想有一个新的数据框,包含日期、名称和等级。但问题是我想要的名字可以同时出现在哥伦布,赢家和输家。如果我想要的名字在winner栏中,我想要Winnerrank,但是如果名字在Loser栏中,我想要loserrank。我该怎么做 df如下所示: Date Winner Loser WRan

我有一个数据帧df,其中有colums日期、赢家、输家、Winnerrak和Loserrank。winnerrank是列获胜者的等级,loserrank也是如此。 我想有一个新的数据框,包含日期、名称和等级。但问题是我想要的名字可以同时出现在哥伦布,赢家和输家。如果我想要的名字在winner栏中,我想要Winnerrank,但是如果名字在Loser栏中,我想要loserrank。我该怎么做

df如下所示:

        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