首页 文章

使用tidyverse转换一组反向列的类?

提问于
浏览
2

如何使用tidyverse转换一组反向列的类?

在这里,数据框 sumtbl 具有临床试验患者Bill和Ted的实验室测试结果,并且反向列的类别是因子 . 我使用tidyr spread 函数将实验室结果从长到宽转换 . 我在这个例子中使用as.character,因为在现实世界中,我的结果是存储为字符值的数字 .

set.seed(7073)
basetbl <- data.frame(pt  = c("BILL","TED"), 
                      res = as.character(abs(rnorm(10))),
                      day = rep(c(1:5), 2))

sumtbl  <- basetbl %>% 
           group_by(pt) %>%
           spread(key = day, value = res) %>%
           ungroup()

basetbl data frame with random numbers for the res column

我尝试过的解决方案之一就是创建一个带有反引号列名的字符向量,但后来我使用_1117105会产生一个评估错误 - 找不到对象 .

modcols  <-  sapply(seq(1:tail(colnames(sumtbl), 1)), function(x) paste0('`',x, '`'))

enter image description here

outtbl   <-  sumtbl %>%
             mutate_at(modcols, funs(as.numeric(.)))

enter image description here

我可以直接更改列,但有更好的方法吗?

sumtbl$`1` <- as.numeric(sumtbl$`1`)

2 回答

  • 2

    我们可以使用 names 来选择列

    sumtbl %>%
         mutate_at(names(.)[-1],  funs(as.numeric(as.character(.))))
    # A tibble: 2 x 6
    #     pt       `1`       `2`        `3`       `4`       `5`
    #  <fctr>     <dbl>     <dbl>      <dbl>     <dbl>     <dbl>
    #1   BILL 0.4861669 0.1039447 0.69618180 0.7344558 0.9792622
    #2    TED 1.2097490 0.6166524 0.01480253 0.9925388 1.0973267
    

    请注意,反引号仅在打印输出中显示 . 如果我们看一下 names

    names(sumtbl)[-1]
    #[1] "1" "2" "3" "4" "5"
    

    所以,'modcols'将是

    modcols <- names(sumtbl)[-1]
    sumtbl %>%
         mutate_at(modcols,  funs(as.numeric(as.character(.))))
    # A tibble: 2 x 6
    #      pt       `1`       `2`        `3`       `4`       `5`
    #   <fctr>     <dbl>     <dbl>      <dbl>     <dbl>     <dbl>
    #1   BILL 0.4861669 0.1039447 0.69618180 0.7344558 0.9792622
    #2    TED 1.2097490 0.6166524 0.01480253 0.9925388 1.0973267
    

    这里不需要包含 vars

  • 5

    以下将有效 . 此外,您要将因子转换为数字,因此必须首先将因子转换为字符,然后使用 as.numeric(as.character(.)) 将数字转换为数字 .

    outtbl   <-  sumtbl %>%
      mutate_at(vars(-pt), funs(as.numeric(as.character(.))))
    
    # # A tibble: 2 x 6
    #       pt       `1`       `2`        `3`       `4`       `5`
    #   <fctr>     <dbl>     <dbl>      <dbl>     <dbl>     <dbl>
    # 1   BILL 0.4861669 0.1039447 0.69618180 0.7344558 0.9792622
    # 2    TED 1.2097490 0.6166524 0.01480253 0.9925388 1.0973267
    

相关问题