r - 使用反向索引删除数据帧的列
问题描述
以下函数将数据框和列索引列表作为参数,并将它们打印出来。
testfunc1 <- function (df, cols){
print(df[cols])
}
例如,以下函数调用打印出数据帧的第 3 列和第 4 列
testfunc1(subset(iris, Species == "setosa")[,1:4], -c(1,2))
但是,我也试图保持函数参数相同,并弄清楚如何打印列索引的倒数。
例如,我想要与上面相同的函数调用,在不添加新参数的情况下打印出数据帧的第一列和第二列
我已将索引乘以 -1 以反转它们,但有没有更好的方法来做到这一点?
testfunc1 <- function (df, cols){
print(df[cols])
print(df[-1*cols])
}
*ps - 我正在尝试仅使用基础 R 来执行此操作
解决方案
如果您不介意在 a 中打印结果数据帧list
,您可以尝试
testfunc2 <- function(df, col){
list(df[col], df[-col])
}
testfunc2(subset(iris, Species == "setosa")[, 1:4], -c(1, 2))
我发现对于您的示例,testfunc2
平均速度比testfunc1
.
library(microbenchmark)
microbenchmark(testfunc1(subset(iris, Species == "setosa")[,1:4], -c(1,2)), testfunc2(subset(iris, Species == "setosa")[,1:4], -c(1,2)))
# Unit: microseconds
# expr min lq mean median uq
# testfunc1(subset(iris, Species == "setosa")[, 1:4], -c(1, 2)) 2651.2 2895.7 5377.846 3839.6 6034.20
# testfunc2(subset(iris, Species == "setosa")[, 1:4], -c(1, 2)) 106.3 137.4 306.929 206.2 282.65
# max neval cld
# 19966.6 100 b
# 2859.5 100 a
除了更短的执行时间之外,将结果数据帧存储在列表中的另一个优点是它可以更轻松地访问打印数据帧的不同部分。
在前面的示例中,df[col]
可以使用testfunc2(...)[[1]]
, while df[-col]
using访问testfunc2(...)[[2]]
。
推荐阅读
- javascript - Konva 可以动态更改 Konva 的文本
- wpf - 当我有 WPF 应用程序时,我会如何处理 Azure 版本?
- javascript - 根据用户上一页的输入更改网页颜色
- python - 根据python中的值对文件进行分箱
- javascript - 从 jQuery $.post() 方法重新运行响应函数,直到响应等于值
- python - 数据框中的文本操作:单词提取
- svg - 为 Inkscape 1.0 导出“.pdf_tex”
- wpf - 将重复的 ItemsControl.ItemsPanel XAML 代码分解为资源
- c++ - C++ 复制构造右值参考题
- ios - 是否可以从 NSFetchedResultsController 获取最新快照