如何在R中每第n列删除多列?

时间:2021-05-07 16:52:52

标签: r

所以我有一个包含未指定列数的数据框(我所知道的是至少有 4 列)。

我想要做的是,对于每 4 列,我想删除第 3 列和第 4 列。

假设我的数据框包含 12 列。 在这种情况下,我想删除第 3、4、7、8、11、12 列。

我知道我可以像这样每第 n 列删除一列:

df <- df[,seq(2,ncol(df),4)]

但是如何使用 R 以相同的方式删除每个第 3 和第 4 列?

谢谢。

2 个答案:

答案 0 :(得分:4)

由于这些是索引,使用 - 删除这些列

i1 <- rep(seq(3, ncol(df), 4) , each = 2) + 0:1
df[,-i1]

或者另一种选择是使用逻辑索引来回收

df[!c(FALSE, FALSE, TRUE, TRUE)]

数据

set.seed(24)
df <- as.data.frame(matrix(rnorm(12 * 4), 4, 12))

答案 1 :(得分:2)

更新: 现在经过一些练习并修改了 akrun 的代码: 以下是我在做的过程中学到的东西:

library(dplyr)
df %>% 
  select(rep(seq(1, ncol(df), 4) , each = 2) + 0:1)

输出:

          V1         V2         V5         V6         V9        V10
1  0.3351943  0.7696819  0.5713866  1.3496121 -0.5712432  0.3612125
2 -0.2318646  1.7709054 -1.2799872 -1.5676166  0.4226218  1.0568642
3  0.5266526 -0.1961822 -1.2388796  0.1437999 -1.6733858 -1.9929205
4 -1.0736261  0.2047497 -0.9225911 -0.8861100 -1.1360259  0.7643851

第一个答案: 感谢 akrun 提供的数据: 有了这些数据,我尝试了我能做的事情: 首先是 long_format,然后是长度为 4 的组(1,1,1,1,2,2,2,2 等...),然后 slice 每组的前两个,然后返回宽格式。 我知道这很尴尬,但它应该可以工作。

set.seed(24)
df <- as.data.frame(matrix(rnorm(12 * 4), 4, 12))

library(tidyverse)
library(tidyr)
df <- df %>%
  pivot_longer(
    cols = everything(),
    names_to = "names",
    values_to = "values"
  ) %>% 
  mutate(Col2 = rep(row_number(), each=4, length.out = n())) %>% 
  group_by(Col2) %>% 
  slice_head(n = 2) %>% 
  ungroup()


df1 <- df %>%
  select(-Col2) %>% 
  pivot_wider(
    names_from = names,
    values_from = values
  ) %>% 
  unnest()

输出:

      V1     V2     V5      V6     V9    V10
   <dbl>  <dbl>  <dbl>   <dbl>  <dbl>  <dbl>
1 -0.546  0.847 -0.335 -0.0743  0.613 -4.47 
2  0.537  0.266  1.54  -0.605   1.52   0.369
3  0.420  0.445  0.610 -1.71    0.657  0.169
4 -0.584 -0.466  0.516 -0.269  -1.07  -1.82