r-复制data.table中的dplyr"any_of()"功能



我可以很容易地将函数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中使用引用修改来实现吗?

我们可以使用setintersect

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> 

最新更新