2016-01-20 47 views
2

我的數據是這樣的在數據幀R字符元素的條件更換

win_loss_table<- data.frame(Player = c("A","B","C","D","E","A","C"),Status = c("A","C","D","Draw","E","C","D")) 
> win_loss_table 
    Player Status 
1  A  A 
2  B  C 
3  C  D 
4  D Draw 
5  E  E 
6  A  C 
7  C  D 

轉化的表應該是這樣的

desired_table <- data.frame(Player = c("A","B","C","D","E","A","C"), Status= c("Won","Lost","Lost","Draw","W0n","Lost","Lost")) 
> desired_table 
    Player Status 
1  A Won 
2  B Lost 
3  C Lost 
4  D Draw 
5  E Won 
6  A Lost 
7  C Lost 

但是使用下面的代碼我越來越像一個數據幀這是不正確的

incorrect_table<- data.frame(Player = c("A","B","C","D","E","A","C"),Status=as.factor(ifelse(win_loss_table$Status == "Draw","Draw",ifelse(win_loss_table$Player %in% win_loss_table$Status,"Won","Lost")))) 
>incorrect_table 
    Player Status 
1  A Won 
2  B Lost 
3  C Won 
4  D Draw 
5  E Won 
6  A Won 
7  C Won 

任何幫助我哪裏去錯了會很大appr eciated

+0

我認爲這個問題在這裏:'ifelse(以%win_loss_table $狀態win_loss_table $玩家%「榮獲」,「迷失」)',它不比較值對的價值,但在第一個看起來每個值列表('win_loss_table $ Player')在第二個'win_loss_table $ Status'中。一個簡單的'=='完成這項工作,如答案所示。 –

回答

0

的一種方式,將使用嵌套ifelse

as.factor(ifelse(as.character(win_loss_table$Player) == as.character(win_loss_table$Status), "Won", 
    ifelse(as.character(win_loss_table$Status) == "Draw", "Draw", "Lost"))) 

#[1] Won Lost Lost Draw Won Lost Lost 
#Levels: Draw Lost Won 

data.frame(Player = c("A","B","C","D","E","A","C"), Status = factor(ifelse(as.character(win_loss_table$Player) == as.character(win_loss_table$Status), "Won", 
                     ifelse(as.character(win_loss_table$Status) == "Draw", "Draw", "Lost")))) 

# Player Status 
#1  A Won 
#2  B Lost 
#3  C Lost 
#4  D Draw 
#5  E Won 
#6  A Lost 
#7  C Lost 
4

你真的不希望與因子水平亂搞。與角色一起工作要容易得多。首先,讓我們強調一下字符。

win_loss_table[] <- lapply(win_loss_table, as.character) 

然後我們可以確定一個向量子集的贏/輸,然後替換Draw。

with(win_loss_table, { 
    replace(c("Won", "Lost")[(Player != Status) + 1L], Status == "Draw", "Draw") 
}) 
# [1] "Won" "Lost" "Lost" "Draw" "Won" "Lost" "Lost"