【问题标题】:How to delete columns one by one in specific order in R如何在R中按特定顺序一一删除列
【发布时间】:2018-07-18 08:43:39
【问题描述】:

所以,我有一个数据集,需要使用 for 循环做一些工作。

这是我的假数据:

#fake data
L <- data.frame(matrix(rnorm(20), nrow=10, ncol=10))
names(L) <- c("P1", "P2", "P3", "P4", "P5", "P6", "P7", "P8", "P9","P10")

现在,我想对整个列应用一个函数并删除列“P1”。然后,再次运行该函数并删除“P5”等等。

这是删除的顺序。

# order of removing column
R < c(P1, P5, P2, P8, P9, P4, P3, P6, P7) 

请帮帮我,谢谢。

【问题讨论】:

  • 我假设您想在每一步都对新数据框做一些事情?否则你会一次性删除所有这些列?
  • R dplyr: Drop multiple columnslibrary(tidyverse); L%&gt;% select(-one_of("P1", "P5", "P2", "P8", "P9", "P4", "P3", "P6", "P7"))的可能重复
  • 我会发现每一步都形成一个多元线性回归模型。所以,基本上我一次删除一个变量。
  • 好吧,将变量选择过程存储在一个字符向量中(在每次迭代后您要保留的列),并在每次迭代后将其传递到数据集以作为子集。我建议你看看 step() 函数在 R 中是如何工作的。
  • 我认为有些软件包可以进行逐步线性回归。例如,查看stats 包中的step()leaps 包中的regsubsets

标签: r for-loop dataframe


【解决方案1】:

这取决于您想要的输出,但我会使用lapply,因此每个数据框子集都保存为列表元素:

R <- c("P1", "P5", "P2", "P8", "P9", "P4", "P3", "P6", "P7") lapply(seq_along(R), function(i) L[-which(names(L) %in% R[1L:i])])

【讨论】:

  • 但我不想在删除 P5 的那一刻恢复 P1
  • 所以“function(i)”将是我要定义的函数?
  • 因为我会发现每一步都形成一个多元线性回归模型。所以,基本上我一次删除一个变量。
  • 是的,如果需要,您可以在函数内部进行更多计算,例如:lapply(seq_along(R), function(i) { df &lt;- L[-which(names(L) %in% R[1L:i])] summary(df) })
  • 注释删除换行符,你应该写`df summary(df)在不同的行
【解决方案2】:

由于您的列名是连续排序的,您可以这样做:

i <- c(1,5,2,8,9,4,3,6,7)
lapply(i,function(x) L[,-x])

【讨论】:

    【解决方案3】:

    使用dplyr::selectpurrr:map,如果您修改R 以包含最后一列,您可能会执行以下操作:

    # example data
    L <- data.frame(matrix(rnorm(20), nrow=10, ncol=10))
    names(L) <- c("P1", "P2", "P3", "P4", "P5", "P6", "P7", "P8", "P9","P10")
    R <- c("P1", "P5", "P2", "P8", "P9", "P4", "P3", "P6", "P7", "P10")
    
    res_list <- 1:ncol(L) %>%
      map(~select(L[R], .x:ncol(L)))
    

    L[R] 用于将列排列为您希望它们删除的顺序。结果是您可以迭代的数据框列表。

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2021-08-28
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多