如何在 R data.table 中选择包含特定字符和列类型的列

B.M*_*una 0 r dataframe data.table

假设我有一个数据框,如下所示;

在此输入图像描述

假设我希望选择列名称中包含“cases”的列,和/或如果我希望选择数字列,如何使用 data.table 语法实现此目的?

即相当于代码tidyverse

df <- df |> 
  select(contains("cases"))
Run Code Online (Sandbox Code Playgroud)

或者

df <- df |> 
  select(where(is.numeric))
Run Code Online (Sandbox Code Playgroud)

结果是;

在此输入图像描述

r2e*_*ans 5

set.seed(42)
quux <- data.table(Region = paste("Region", LETTERS[1:3]), cases_1=runif(3), cases_2=sample(20,size=3), cases_3=runif(3))
quux
#      Region   cases_1 cases_2   cases_3
#      <char>     <num>   <int>     <num>
# 1: Region A 0.9148060      10 0.1346666
# 2: Region B 0.9370754       4 0.6569923
# 3: Region C 0.2861395      18 0.7050648

quux[, .SD, .SDcols = patterns("cases")]
#      cases_1 cases_2   cases_3
#        <num>   <int>     <num>
# 1: 0.9148060      10 0.1346666
# 2: 0.9370754       4 0.6569923
# 3: 0.2861395      18 0.7050648
Run Code Online (Sandbox Code Playgroud)

虽然文字“if numeric”如 @Tobo 所说,但如果您的逻辑稍微复杂一点,那么您可以用来sapply生成一个向量(逻辑、整数或名称)。请注意,我们不能.SD在这里使用。

quux[, .SD, .SDcols = is.numeric]
#      cases_1 cases_2   cases_3
#        <num>   <int>     <num>
# 1: 0.9148060      10 0.1346666
# 2: 0.9370754       4 0.6569923
# 3: 0.2861395      18 0.7050648
quux[, .SD, .SDcols = sapply(quux, is.numeric)] # same output
Run Code Online (Sandbox Code Playgroud)

通过“更复杂”,如果您想过滤名称中包含“cases”并且是数字但不是整数(人为的)的列,那么

cols <- grepl("cases", colnames(quux)) & sapply(quux, typeof) == "double"
quux[, .SD, .SDcols = names(which(cols))]
#      cases_1   cases_3
#        <num>     <num>
# 1: 0.9148060 0.1346666
# 2: 0.9370754 0.6569923
# 3: 0.2861395 0.7050648
quux[, names(which(cols)), with=FALSE] # same output
Run Code Online (Sandbox Code Playgroud)

typeof返回double数字和integer整数,这里有明显的区别。)