我有一个数据框,它已经合并了足球赛季的球员和球队数据 所以对于特定赛季中的特定球员,我有像
这样的数据df <- data.frame(team=c(NA,"CRP",NA,"CRP","CRP",NA),
player=c(NA,"Ed",NA,"Ed","Ed",NA),
playerGame= c(NA,1,NA,2,3,NA),
teamGame =c(1,2,3,4,5,6))
NA表示玩家没有出现在特定的团队游戏中
我如何能够最有效地用“CRP”和“Ed”替换球队和球员NA 并且有一个plGame输出,在本例中为0,1,1,2,3,3
修改
抱歉,我在半夜醒来的时候写了这篇文章,可能过分简化了我的问题。只有一个人似乎已经意识到这是一个更大的数据集的一个子集,甚至他/她没有遵循它虽然直接硬编码替换球员和球队是不够的 谢谢你的回复。 Dsee暗示动物园套餐中的na.locf和AK的第一行答案似乎提供了最好的前进方式
df$playerGame[df$teamGame == min(df$teamGame) & is.na(df$playerGame) == TRUE] <- 0
na.locf(df$playerGame)
这涵盖了多个NA启动序列的可能性。在我的情况下,min(df $ teamGame)总是1,所以硬编码可以加快速度
这是一个更现实的例子
library(zoo)
library(plyr)
newdf <- data.frame(team=c("CRP","CRP","CRP","CRP","CRP","CRP","TOT","TOT","TOT"),
player=c(NA,"Ed",NA,"Bill","Bill",NA,NA,NA,"Tom"),
playerGame= c(NA,1,NA,1,2,NA,NA,NA,1),
teamGame =c(1,2,3,1,2,3,1,2,3))
我现在可以向每一行展示团队 每个球队在一个赛季中打三场比赛。 Ed和Bill,为CRP效力,分别出现在第2场和第1,2场比赛中。汤姆只参加第3场比赛的TOT比赛。假设玩家名称是唯一的(即使在现实世界数据中)
在我看来,我需要创建另一个专栏'playerTeam'
newdf$playerTeam <- 0
for (i in 1:nrow(newdf)) {
newdf$playerTeam[i] <-ceiling(i/3)
}
然后我可以使用此值来填补玩家空白。我使用了排序功能 省略了NA
newdf <- ddply(newdf,.(playerTeam),transform,player=sort(player)[1])
然后我可以使用上述代码
newdf$playerGame[newdf$teamGame == 1 & is.na(newdf$playerGame) == TRUE] <- 0
newdf$playerGame <- na.locf(newdf$playerGame)
team player playerGame teamGame playerTeam
1 CRP Ed 0 1 1
2 CRP Ed 1 2 1
3 CRP Ed 1 3 1
4 CRP Bill 1 1 2
5 CRP Bill 2 2 2
6 CRP Bill 2 3 2
7 TOT Tom 0 1 3
8 TOT Tom 0 2 3
9 TOT Tom 1 3 3
我也需要在赛季中建立,但这应该不是问题
我在这里遗漏了什么吗?
我有几十万行要处理,所以任何加速都会有所帮助。例如,我可能想要避免ddply并使用data.table方法或另一个apply函数,对吧
答案 0 :(得分:2)
你想要的似乎有两个部分:
对于(1),你可以这样做:
df$team[is.na(df$team)] <- 'CRP'
同样,您可以更改数据框的其他组件
对于(2)你可以这样做:
if(is.na(df$playerGame[1])) {
df$playerGame[1] <- 0
}
for(i in 2:length(df$playerGame)) {
if(is.na(x[i])) {
df$playerGame[i] <- df$playerGame[i-1]
}
}
然后df$playerGame
是:
[1] 0 1 1 2 3 3
也许有一种非常好的方法可以做到这一点,但这显然是可读的......
答案 1 :(得分:1)
选择NA,比如player
,请使用
df$player[is.na(df$player)]
然后为这些使用分配值
df$player[is.na(df$player)] <- "Ed"
如果您只想为整个播放器列分配相同的名称,则无需选择任何值:
df$player[] <- "Ed" # you can omit the brackets [], which are shown just for emphasis
然后您可以对df$team
<小时/> 另外,在您创建数据框时,如果您计划添加除已存在的值以外的值,则可能需要添加
stringsAsFactors=FALSE
data.frame( . , stringsAsFactors=FALSE)
答案 2 :(得分:1)
替换球队和球员的NA:
df$team[is.na(df$team)] <- "CRP"
df$player[is.na(df$player)] <- "Ed"
可能有一种更有效的方法来获取相邻的值,但是有效。
如果第一个或/和最后一个值是NA,如在您的示例中,我必须使用另外两行:
df$playerGame[df$teamGame == min(df$teamGame) & is.na(df$playerGame) == TRUE] <- 0
df$playerGame[df$teamGame == max(df$teamGame) & is.na(df$playerGame) == TRUE] <- max(df$playerGame, na.rm = TRUE)
对于所有其他观察,这得到相邻的值:
df$playerGame[is.na(df$playerGame) == TRUE] <- df$playerGame[-1]
df
team player playerGame teamGame
CRP Ed 0 1
CRP Ed 1 2
CRP Ed 1 3
CRP Ed 2 4
CRP Ed 3 5
CRP Ed 3 6
对于多个团队和/或玩家,我建议将其与ddply(plyr)结合使用。