索引data.frame

时间:2017-03-28 15:34:16

标签: r regex loops dataframe

这个问题更多的是好奇心而不是其他任何问题。我已经知道如何通过列将类应用于数据框,但我正在寻找的是一种更简单的方法来显示可能的类是/可能用于测试目的。

是的,有些事情已经在tidyverse中做到了,但是在找到更好的方法来执行这些步骤时,它可能会帮助我完成其他功能和实现。

期望的结果:

返回1行的data.frame,其中插入匹配的class / regex名称,而不是检查中的值或逻辑(见下文)

虚假数据

所以我们假设我们有一个来自未知来源的混合读取数据......在我们解析后,它作为所有字符类进入R(我从基础数据集中重现:

usa_a <- structure(
 list(
  states = c("Alabama", "Alaska", "Arizona", "Arkansas", "California"),
  Murder = c(13.2, 10, 8.1, 8.8, 9), 
  Assault = c(236L, 263L, 294L, 190L, 276L), 
  UrbanPop = c(58L, 48L, 80L, 50L, 91L),
  Rape = c(21.2, 44.5, 31, 19.5, 40.6), 
  log = c(TRUE, TRUE, TRUE, TRUE, TRUE), 
  fracs = c(113.953488372093, 74.4186046511628, 
            109.302325581395, 53.4883720930233, 
            55.8139534883721), 
  mix_bag = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", 
              "Hornet 4 Drive", "Hornet Sportabout")
             ), 
  .Names = c("states", "Murder", "Assault", "UrbanPop", 
             "Rape", "log", "fracs", "mix_bag"),
  row.names = c("Alabama", "Alaska", "Arizona", "Arkansas", 
              "California"), 
  class = "data.frame")
强制所有字符用于我们的目的
usa_a <- usa_a %>% mutate_all(as.character)
str(usa_a)
$ states  : chr "Alabama"
$ Murder  : chr "13.2"
$ Assault : chr "236"
$ UrbanPop: chr "58"
$ Rape    : chr "21.2"
$ log     : chr "TRUE"
$ fracs   : chr "113.953488372093"
$ mix_bag : chr "Mazda RX4"

现在确定/分类/追加我要使用正则表达式进行验证的类类型:

rgx.pats <- list(
  numeric = "^(\\d){1,}(\\.(\\d){1,})?",
  logical = "^(TRUE|FALSE)$",
  character = "(?!^[(\\d){1,}(\\.(\\d){1,})?|(TRUE|FALSE)]+$)^.+$"
)

这是一个问题......我错过了一些明显的东西,并且过度思考这个/更简单或更好的方法......在整齐的方面。

请求:

如果您的解决方案使用data.table,请向您的婴儿解释...

这是函数原样..

class_idx <- mapply(function(x){
    a <- lapply(names(rgx.pats), function(i){
        if(all(stringi::stri_detect_regex(x, rgx.pats[[i]]))){
            i
        }else{
            FALSE
        }
    })
}, usa_a) %>% {
    d <- as.data.frame(.)
    dd <- sapply(colnames(d), function(i){
        which(!mapply(is.logical,d[[i]]))
    })
    as.data.frame(mapply(function(j, y){
        d[j,y]
    }, dd, names(dd)))
}

class_idx
    states  Murder Assault UrbanPop    Rape     log   fracs   mix_bag
1 character numeric numeric  numeric numeric logical numeric character

所以如你所见,它有效,我只是觉得我在不需要时会陷入循环的坏习惯而无法想到另一种方法。所有反馈/想法都受到赞赏。

0 个答案:

没有答案