【问题标题】:Custom function to make duplicated values distinct based on a condition in R根据 R 中的条件使重复值不同的自定义函数
【发布时间】:2018-08-18 17:05:47
【问题描述】:

数据集可以从here下载

library(dplyr)
NBA <- read.csv("NBA Season Dataset/Seasons_Stats.csv")
NBA$Player <- as.character(NBA$Player)
PlayerData <- read.csv("NBA Season Dataset/player_data.csv")
PlayerData$name <- as.character(PlayerData$name)

我想从PlayerData 获取他们的身高和体重,然后结合主要数据NBA。问题是这个 NBA 球员数据集包含一些与其他球员同名的球员,所以在将两个数据框与球员姓名merge 合并之前,我需要区分他们的名字。

PlayerData[duplicated(PlayerData$name), "name"] 给我 50 个重复的名字。

所以我创建了一个函数,它将根据玩家活跃的年份在两个数据框中重命名玩家:

unduplicate <- function(name, year_start, year_end, new_name) { 
    PlayerData[PlayerData$name == name & PlayerData$year_start == year_start & PlayerData$year_end == year_end, 1] = new_name
    NBA[NBA$Player == name & NBA$Year <= year_end & NBA$Year >= year_start, "Player"] = new_name
}

例如,我以这两个同名的玩家为例。

然后调用函数:

unduplicate("Dee Brown", 1991, 2002, "Dee Brown 1")
unduplicate("Dee Brown", 2007, 2009, "Dee Brown 2")

什么都没有改变...

但如果我像这样手动操作:

PlayerData[PlayerData$name == "Dee Brown" & PlayerData$year_start == 1991 & PlayerData$year_end == 2002, 1] = "Dee Brown 1"
NBA[NBA$Player == "Dee Brown" & NBA$Year <= 2002 & NBA$Year >= 1991, "Player"] = "Dee Brown 1"

PlayerData[PlayerData$name == "Dee Brown" & PlayerData$year_start == 2007 & PlayerData$year_end == 2009, 1] = "Dee Brown 2"
NBA[NBA$Player == "Dee Brown" & NBA$Year <= 2009 & NBA$Year >= 2007, "Player"] = "Dee Brown 2"

然后得出想要的结果:

所以我的问题是,

1) 函数有什么问题?我检查并尝试了许多变体都不起作用。

2) 有没有更好的方法来解决这个问题?

我对此有点陌生,如果这只是愚蠢的初学者错误,请原谅我。

谢谢!

【问题讨论】:

  • 你能把你的数据发到dput吗?图像不允许我们在 R 会话中重新创建数据集。使用dput(NBA)dput(PlayerData) 的输出编辑问题,可能只过滤感兴趣的行之后。此外,您对数据框的更改是函数本地的,它们不会在全局环境中更改它们。

标签: r


【解决方案1】:

您可以使用 distinct from dplyr 根据一组变量选择独特的玩家。 Sqldf 库提供了基于不等式条件合并表的可能性:

library(dplyr)                 
player_data <- read.csv("player_data.csv", stringsAsFactors = F)
Players <- read.csv("Players.csv", stringsAsFactors = F)
NBA1<-  read.csv("Seasons_Stats.csv", stringsAsFactors = F)

Dist_players <-player_data%>%
  distinct(name, year_start, year_end, height,  weight )

library(sqldf)
Final <- sqldf("SELECT * FROM NBA1 JOIN Dist_players ON NBA1.Player = Dist_players.name 
      WHERE NBA1.Year >= Dist_players.year_start AND NBA1.Year <= Dist_players.year_end")

【讨论】:

  • 试过了,效果很好!所以我被困在merge 方式中,而使用 SQL 方式效率更高。非常感谢!
猜你喜欢
  • 2019-01-02
  • 2019-04-30
  • 2018-05-04
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多