首页 > 解决方案 > case_when:找不到对象列名

问题描述

下面的脚本将解析一些 json 并返回一个包含 player 列名的数据框。那里有我想更改的名称,因为它们与我的另一个数据集不匹配。我不确定下面的 case_when 参数有什么问题。我已经用谷歌搜索了它并查看了很多其他尝试,但似乎无法让它去。

library(jsonlite)
library(tidyverse)
library(dplyr)

# GET Todays date
today <- Sys.Date()-1
#Json return from URL
getlabteamsRaw <- paste0('https://www.fantasylabs.com/api/lines/4/', today, '/startinggoalies')
# Turn Value into List
getlabteams <- fromJSON(getlabteamsRaw)
teams <- c(getlabteams$GoalieMatchups$Properties$HomeTeam, getlabteams$GoalieMatchups$Properties$VisitorTeam)
myfun <- function(x) {
  getlabskatersRaw <- paste0('https://www.fantasylabs.com/api/lines/4/', x,'/', today)
  getlabskaters <- fromJSON(getlabskatersRaw)
  select(getlabskaters$PlayerLines$Properties, FullName, Position, Line, Team, OppTeam, Salary_DK, Salary_FD, ActualPoints_DK, ActualPoints_FD, ImpPts_DK, ImpPts_FD)
}
full_labs_skater_df <- teams %>% 
  set_names() %>% 
  map_df(myfun, .id = "team")
# Seperate F and D from Line (1F,1D)
full_labs_skater_df$Line <- gsub('F', '', full_labs_skater_df$Line)
full_labs_skater_df$Line <- gsub('D', '', full_labs_skater_df$Line)
# Create seperate columns from non powerplay, powerplay 1, powerplay 2
full_labs_skater_df$ppline3 <- ifelse(full_labs_skater_df$Line %in% c("1","2","3","4"), 0, '')
full_labs_skater_df$ppline1 <- ifelse(full_labs_skater_df$Line == "PP1", 1, '')
full_labs_skater_df$ppline2 <- ifelse(full_labs_skater_df$Line == "PP2", 2, '')
# Combine all powerplay lines into 1
full_labs_skater_df$PPLine <- paste(full_labs_skater_df$ppline1,full_labs_skater_df$ppline2,full_labs_skater_df$ppline3)
# Drop extra columns
keep_lab_features <- c("FullName","Position","Line","PPLine","Team","OppTeam","Salary_DK","Salary_FD",
                       "ActualPoints_DK","ActualPoints_FD","ImpPts_DK","ImpPts_FD")
full_labs_skater_df <- full_labs_skater_df[keep_lab_features]
# Create 3 dataframes to filtering by non powerplay players, powerplay players and goalies.
lab_skater_df <- full_labs_skater_df[full_labs_skater_df$Line %in% c("1","2","3","4"),]
powerplay_lab_skater_df <- full_labs_skater_df[full_labs_skater_df$Line %in% c("PP1","PP2"),]
goalie_lab_skater_df <- full_labs_skater_df[full_labs_skater_df$Line %in% c("1G","2G"),]
# Full join the skaters back together by Fullname to get powerplay lines 
skater_lab <- full_join(lab_skater_df, powerplay_lab_skater_df, 
                                by = c("FullName"))
keep_lab_skater <- c("FullName","Position.x","Line.x","PPLine.y","Team.x","OppTeam.x","Salary_DK.x","Salary_FD.x",
                       "ActualPoints_DK.x","ActualPoints_FD.x","ImpPts_DK.x","ImpPts_FD.x")
skater_lab <- skater_lab[keep_lab_skater]
skater_lab[is.na(skater_lab)] <- 0
colnames(skater_lab)[colnames(skater_lab)=="FullName"] <- "player"
colnames(skater_lab)[colnames(skater_lab)=="Position.x"] <- "Position"
colnames(skater_lab)[colnames(skater_lab)=="Line.x"] <- "Line"
colnames(skater_lab)[colnames(skater_lab)=="PPLine.y"] <- "PPLine"
colnames(skater_lab)[colnames(skater_lab)=="Team.x"] <- "Team"
colnames(skater_lab)[colnames(skater_lab)=="OppTeam.x"] <- "OppTeam"
colnames(skater_lab)[colnames(skater_lab)=="Salary_DK.x"] <- "Salary_DK"
colnames(skater_lab)[colnames(skater_lab)=="Salary_FD.x"] <- "Salary_FD"
colnames(skater_lab)[colnames(skater_lab)=="ActualPoints_DK.x"] <- "ActualPoints_DK"
colnames(skater_lab)[colnames(skater_lab)=="ActualPoints_FD.x"] <- "ActualPoints_FD"
colnames(skater_lab)[colnames(skater_lab)=="ImpPts_DK.x"] <- "ImpPts_DK"
colnames(skater_lab)[colnames(skater_lab)=="ImpPts_FD.x"] <- "ImpPts_FD"
skater_lab$player <- gsub(' ', '.', skater_lab$player)
skater_lab$player <- toupper(skater_lab$player)


skater_lab$player <- mutate(
  player = 
    ## Specific name changes
    case_when(
      player == "ANDREI.KASTSITSYN" ~ "ANDREI.KOSTITSYN",
      player == "AJ.GREER" ~ "A.J..GREER",
      player == "ANDREW.GREENE" ~ "ANDY.GREENE",
      player == "ANDREW.WOZNIEWSKI" ~ "ANDY.WOZNIEWSKI", 
      player == "ANTHONY.DEANGELO" ~ "TONY.DEANGELO",
      player == "BATES (JON).BATTAGLIA" ~ "BATES.BATTAGLIA",
      player %in% c("BJ.CROMBEEN", "B.J.CROMBEEN", "BRANDON.CROMBEEN") ~ "B.J..CROMBEEN", 
      player == "BRADLEY.MILLS" ~ "BRAD.MILLS",
      player == "CAMERON.BARKER" ~ "CAM.BARKER", 
      player == "COLIN (JOHN).WHITE" ~ "COLIN.WHITE",
      player == "CRISTOVAL.NIEVES" ~ "BOO.NIEVES",
      player == "CHRIS.VANDE VELDE" ~ "CHRIS.VANDEVELDE", 
      player == "DANNY.BRIERE" ~ "DANIEL.BRIERE",
      player %in% c("DAN.CLEARY", "DANNY.CLEARY") ~ "DANIEL.CLEARY",
      player == "DANIEL.GIRARDI" ~ "DAN.GIRARDI", 
      player == "DANNY.O'REGAN" ~ "DANIEL.O'REGAN",

      TRUE ~ player
    )
)
skater_lab$player[[col_name]] <- skater_lab$player

标签: rcase-when

解决方案


您忘记将数据框传递给 mutate 函数,并且您将生成的数据框保存到player列中。你可以这样做:

skater_lab <- mutate(skater_lab, player=case_when(...))

或者像这样:

skater_lab <- skater_lab %>% mutate(player=case_when(...))

或者像这样:

skater_lab$player <- with(skater_lab, case_when(...))

推荐阅读