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)
结果是;
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整数,这里有明显的区别。)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |