所以我有一个包含未指定列数的数据框(我所知道的是至少有 4 列)。
我想要做的是,对于每 4 列,我想删除第 3 列和第 4 列。
假设我的数据框包含 12 列。 在这种情况下,我想删除第 3、4、7、8、11、12 列。
我知道我可以像这样每第 n 列删除一列:
df <- df[,seq(2,ncol(df),4)]
但是如何使用 R 以相同的方式删除每个第 3 和第 4 列?
谢谢。
答案 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