我可以很容易地将函数as.integer
应用于tibble
中与提供给any_of()
:的列名匹配的所有列
df <- tibble::tibble(x = c("1","2","3"), y = c("4","5","6"), z = c("7","8","9"))
cols <- c("x","y","z","a","b","c")
dplyr::mutate(df, dplyr::across(dplyr::any_of(cols), as.integer))
# A tibble: 3 x 3
x y z
<int> <int> <int>
1 1 4 7
2 2 5 8
3 3 6 9
该功能能否在data.table
中轻松复制?我想避免与tidyverse
(以及R的其余部分(相关的修改时复制:
tracemem(df)
[1] "<0000026B195C4090>"
dplyr::mutate(df, dplyr::across(dplyr::any_of(cols), as.integer))
tracemem[0x0000026b195c4090 -> 0x0000026b196d1110]: <Anonymous> eval_select_impl <Anonymous> across_setup <Anonymous> .Call <Anonymous> withCallingHandlers mutate_cols mutate.data.frame <Anonymous>
tracemem[0x0000026b195c4090 -> 0x0000026b197d44d0]: new_data_frame vec_data dplyr_vec_data as.list dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d44d0 -> 0x0000026b197d4480]: new_data_frame dplyr_vec_data as.list dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d4480 -> 0x0000026b197d43e0]: as.list.data.frame as.list dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d43e0 -> 0x0000026b197d3d50]: new_data_frame dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d3d50 -> 0x0000026b197d3d00]: new_data_frame dplyr_new_data_frame dplyr_reconstruct dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d3d00 -> 0x0000026b197d3b20]: dplyr_reconstruct.data.frame dplyr_reconstruct_dispatch dplyr_reconstruct dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d3b20 -> 0x0000026b197d3ad0]: dplyr_reconstruct.data.frame dplyr_reconstruct_dispatch dplyr_reconstruct dplyr_col_modify.data.frame dplyr_col_modify mutate.data.frame <Anonymous>
tracemem[0x0000026b197d3ad0 -> 0x0000026b197d36c0]: lapply tbl_subset_row [.tbl_df [ do.call head.data.frame head as.data.frame trunc_mat format.tbl format paste0 <Anonymous> print.tbl <Anonymous>
这可以在data.table
中使用引用修改来实现吗?
我们可以使用set
和intersect
library(data.table)
setDT(df)
for(v in intersect(cols, names(df))) {
set(df, i = NULL, j = v, value = as.integer(df[[v]]))
}
我们可以使用intersect
找到常见列,并使用.SDcols
将这些列更改为整数。
library(data.table)
setDT(df)
correct_cols <- intersect(cols, names(df))
df[, (correct_cols) := lapply(.SD,as.integer), .SDcols = correct_cols]
df
# x y z
#1: 1 4 7
#2: 2 5 8
#3: 3 6 9
str(df)
#Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables:
# $ x: int 1 2 3
# $ y: int 4 5 6
# $ z: int 7 8 9
# - attr(*, ".internal.selfref")=<externalptr>