根据REGEX更改列

问题描述

我有一个非常庞大的数据集,其中包含结果和日期。 数据的一小部分(我还有更多具有不同名称和行的列):

 result_1    date_1 result_2    date_2 result_3    date_3 result_4    date_4
1        1 12.8.2020        4 13.8.2020        2 15.8.2020        1 20.8.2020
2        3 15.8.2020        3 14.8.2020        5 17.8.2020        2 21.8.2020

我想根据列名将某些列更改为数字。 我想到可能用正则表达式调用向量,如下所示:

data$"result.*" <- as.numeric(data$"result\.*")

但是会产生错误:

Error in `$<-.data.frame`(`*tmp*`,"result.*",value = numeric(0)) : 
  replacement has 0 rows,data has 2

我也可以使用mutate或某种循环,但是我敢肯定有一种更有效的方法来执行此操作,特别是因为数据集很大。

解决方法

dat <- dplyr::tibble(result_1=c(1,2),date_1=c(2,3),result_2=c(3,4),date_2=c(34,3)) 

dat %>% 
  dplyr::mutate_if(is.numeric,as.character) %>%
  dplyr::mutate_at(dplyr::vars(dplyr::matches("result")),as.numeric)
,

另一个答案有效,但是请注意,mutate_atmutate_ifacross中的dplyr函数取代:

dat <- data.frame(result_1 = c("4","2"),date_1 = letters[1:2],result_2 = c("2","3"))

tidyverse

library(dplyr)

dat %>% mutate(across(matches("result_.*"),as.numeric))
#>   result_1 date_1 result_2
#> 1        4      a        2
#> 2        2      b        3

data.table

library(data.table)

dat <- data.table(dat)
cols <- grep("result_.*",names(dat),value=TRUE)
dat[,(cols) := lapply(.SD,as.numeric),.SDcols=cols]
dat
#>    result_1 date_1 result_2
#> 1:        4      a        2
#> 2:        2      b        3

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...