首页 > 解决方案 > 使用反向索引删除数据帧的列

问题描述

以下函数将数据框和列索引列表作为参数,并将它们打印出来。

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 来执行此操作

标签: 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]]


推荐阅读