【问题标题】:Creating a new variable from a lookup table从查找表创建新变量
【发布时间】:2012-01-16 00:56:15
【问题描述】:

我的数据集中有以下列:

presult     aresult
  I         single
  I         double
  I         triple
  I         home run
  SS        strikeout

我想添加第三列“bases”,它取决于列 aresult 中的结果值。

例如,我希望单垒为 1,双垒为 2,三垒为 3,本垒打为 4,三振为 0。

通常我会像这样创建新变量:

dataset$base<-ifelse(dataset$aresult=="single", 1, 0)

问题是我不知道如何在不将所有其他变量设置为零的情况下对新变量进行编码。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    以下是如何使用命名向量进行查找:

    定义测试数据:

    dat <- data.frame(
        presult = c(rep("I", 4), "SS", "ZZ"),
        aresult = c("single", "double", "triple", "home run", "strikeout", "home run"),
        stringsAsFactors=FALSE
    )
    

    用分数定义一个命名的数字向量:

    score <- c(single=1, double=2, triple=3, `home run`=4,  strikeout=0)
    

    使用矢量索引将分数与结果相匹配:

    dat$base <- score[dat$aresult]
    dat
      presult   aresult base
    1       I    single    1
    2       I    double    2
    3       I    triple    3
    4       I  home run    4
    5      SS strikeout    0
    6      ZZ  home run    4
    

    附加信息:

    如果你不想手动构造命名向量,比如说你有大量数据的情况,那么按如下方式进行:

    scores <- c(1:4, 5)
    names(scores) <- c("single", "double", "triple", "home run", "strikeout")
    

    (或者从现有数据中读取值和名称。重点是构造一个数字向量,然后分配名称。)

    【讨论】:

    • 使用命名向量的好技巧。我在这里学到了一些东西。
    • +1 使用命名向量的好主意。希望我在几年前看到/想到这一点!
    • @Andrie。有没有办法做到这一点而不必指定行。我有一个包含数千行的数据集。
    • @BurtonGuster 我添加了其他信息。我希望这会有所帮助。
    【解决方案2】:

    定义查找表

    lookup= data.frame( 
            base=c(0,1,2,3,4), 
            aresult=c("strikeout","single","double","triple","home run"))
    

    然后使用 plyr 中的连接

    dataset = join(dataset,lookup,by='aresult')
    

    【讨论】:

    • 比 Dieter 的解决方案更冗长,但这样您就可以灵活地定义映射 aresult-> base。
    【解决方案3】:

    Dieter's answer 的替代方案:

    dat <- data.frame(
      presult = c(rep("I", 4), "SS", "ZZ"),
      aresult = c("single", "double", "triple", "home run", "strikeout", "home run"),
      stringsAsFactors=FALSE
    )
    
    dat$base <- as.integer(factor(dat$aresult,
      levels=c("strikeout","single","double","triple","home run")))-1
    

    【讨论】:

      【解决方案4】:
       dataset$base <- as.integer(as.factor(dataset$aresult))
      

      根据您的数据,as.factor() 可以省略,因为在许多情况下,字符串默认是因子,例如与 read.table

      【讨论】:

      • 如何指定每个结果的取值?
      • 不错的方法,但要使其工作,“删除”需要在列表中排在第一位,然后您必须减去 1。
      • @burton 我的解决方案允许您这样做
      • @Andrie: 或使用 factor 而不是 as.factor 并根据需要指定级别/标签。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2020-08-06
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多