【问题标题】:Conditional Replacement of character elements in data frame R [duplicate]数据框R中字符元素的条件替换[重复]
【发布时间】:2016-04-25 19:42:33
【问题描述】:

我的数据是这样的

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

任何关于我哪里出错的帮助将不胜感激

【问题讨论】:

  • 我认为问题出在:ifelse(win_loss_table$Player %in% win_loss_table$Status,"Won","Lost"),它不会将值与值进行比较,而是在第二个列表 win_loss_table$Status 中查看第一个列表 (win_loss_table$Player) 中的每个值。如答案所示,一个简单的== 就可以完成这项工作。

标签: r


【解决方案1】:

您真的不想在因子水平上胡闹。处理角色要容易得多。首先让我们将列强制转换为字符。

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"

【讨论】:

    【解决方案2】:

    一种方法是使用嵌套的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
    

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 2013-12-23
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多