【问题标题】:Manipulate factor list in R [closed]操纵R中的因子列表[关闭]
【发布时间】:2014-10-31 13:59:02
【问题描述】:

我在 R 中有一个向量,它是一个因素列表,一个包含 256 支 nfl 球队的列表。我需要将每支球队的名称从“华盛顿红皮队”改为“WAS”,或将“新英格兰爱国者队”改为“NE”。解决此类问题的最佳技术是什么。我敢肯定这很容易,所以不要在这个问题上打败我。

【问题讨论】:

  • 我的反对意见是(在我看来非常明显)关于为什么会期望知道_a_priori_“华盛顿红皮队”应该是“WAS”而“新英格兰爱国者队”应该是“NE”的混淆.似乎更合乎逻辑的期望是WRNEP,即每个名字的第一个字母。
  • 好吧,让我更好地解释一下,我有一个 data.frame,它是 2014 年的时间表,其中包含主队和客队的时间表。他们都是全队名“华盛顿红人队”...所以我需要将每个 HomeTeam 和 Awayteam 更改为正确的首字母缩写词“WAS”...希望这有助于更好地解释问题
  • 一个解释(会很好,但你没有解决我的投诉的任何细节),并且......现在让我们看看一些......代码。代码就是 SO 的全部意义所在。

标签: r vector apply lapply


【解决方案1】:

您可以从网页中读取首字母缩略词,并将团队名称与您的名称相匹配。

这是一个例子。

library(XML)
tab <- readHTMLTable("http://sportsdelve.wordpress.com/abbreviations/")[[1]]
head(tab)
#       V1                     V2
# 1    ARZ      Arizona Cardinals
# 2    ATL        Atlanta Falcons
# 3    BAL       Baltimore Ravens
# 4   BALC        Baltimore Colts
# 5   BCLT Baltimore Colts (1950)
# 6 BALCLT Baltimore Colts (AAFC)

您可以使用正则表达式匹配来查找您的团队...

tab[grepl("WAS|NE", tab[[1]]), ]
#     V1                   V2
# 38  NE New England Patriots
# 58 WAS  Washington Redskins

【讨论】:

    【解决方案2】:

    你可以直接改变关卡

    levels(team)
    

    将列出分配给您的因素的级别的顺序

    levels(team) <- c("ARZ","ATL", ...)
    

    将更改标签。

    【讨论】:

      【解决方案3】:

      “合并”命令也有效:(在此处使用 Chaconne 的数据)

      full.names <- data.frame(full = c("wash", "wash", "denv", "denv", "wash")) 
      dic <- data.frame(full = c("wash", "denv"), short = c("ww", "dd")) 
      
      merge(full.names,dic)
        full short
      1 denv    dd
      2 denv    dd
      3 wash    ww
      4 wash    ww
      5 wash    ww
      

      【讨论】:

        【解决方案4】:

        一种方法是拥有一个字典,即一个包含每个全名和每个短名的文件。然后,您可以将此文件与您的全名进行匹配,使用全名作为匹配的 ID。

        例子:

        full.names <- data.frame(full = c("wash", "wash", "denv", "denv", "wash")) ## needs to be a data frame in order for plyr::join to work
        
        dic <- data.frame(full = c("wash", "denv"), short = c("ww", "dd")) ## the dictionary; one row per unique name
        
        matched <- plyr::join(x = full.names, y = dic, by = "full") ## using join from the plyr package
        

        输出:

          full short
        1 wash    ww
        2 wash    ww
        3 denv    dd
        4 denv    dd
        5 wash    ww
        

        【讨论】:

        • 这需要一些努力,但效果很好。谢谢
        猜你喜欢
        • 1970-01-01
        • 2020-08-17
        • 2016-04-13
        • 2018-07-21
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多