问题描述
我有一个非常庞大的数据集,其中包含结果和日期。 数据的一小部分(我还有更多具有不同名称和行的列):
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_at
和mutate_if
被across
中的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