【问题标题】:Iterating through data frame and comparing遍历数据框并进行比较
【发布时间】:2015-11-18 02:57:14
【问题描述】:

假设我有一个非常简单的数据框,如下所示:

  v    h  ptsv  ptsh
PIT   NE    21    28
 GB   KC    31    23 
CHI  HOU    27    20

它有访客 (v) 和主队 (h) 列,它有得分 (ptsv, ptsh) 列。我想在数据框中创建一个新列,用于比较得分并输入主队或客队的姓名首字母。

我写了这段代码:

tbl2$win <- rep("x",nrow(tbl2)) <BR>
tbl2$win <- ifelse(tbl2$ptsh > tbl2$ptsv,  tbl2$h, tbl2$v)

它不是打印出首字母缩写,而是按字母顺序打印出它们的数字。对 R 来说还是个新手。

【问题讨论】:

    标签: r dataframe levels


    【解决方案1】:
       tbl2$win <- ifelse(tbl2$ptsh > tbl2$ptsv,  tbl2$h, tbl2$v)
    

    不需要您的第一行代码

    【讨论】:

    • 很有趣,但我想知道为什么它不会在新列中打印“NE”、“CHI”等实际值。它会打印出 1:6 的数字,因为我认为是字母等效点(级别 = CHI、GB、HOU、KC、NE、PIT)
    【解决方案2】:

    您的data.frame 中有factor 数据,这会混淆ifelse

    str(tbl2)
    #'data.frame':   3 obs. of  4 variables:
    # $ v   : Factor w/ 3 levels "CHI","GB","PIT": 3 2 1
    # $ h   : Factor w/ 3 levels "HOU","KC","NE": 3 2 1
    # ...
    

    来自?ifelse 帮助页面示例:

    ## ifelse() 去除属性
    ## 这在处理日期和因素时很重要

    首先使用as.character 转换这些列:

    tbl2[c("v","h")] <- lapply(tbl2[c("v","h")], as.character)
    ifelse(tbl2$ptsh > tbl2$ptsv,  tbl2$h, tbl2$v)
    #[1] "NE"  "GB"  "CHI"
    

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      相关资源
      最近更新 更多