根据列名中的数字选择dataframe列

根据列名中的数字选择dataframe列,r,dplyr,stringr,R,Dplyr,Stringr,我有一组数据帧,每个数据帧都有许多列。在每个数据帧中,一些列被命名为Test_1、Test_2、Test_3等,测试列的总数各不相同 一些(但不是全部!)测试有相关的结果。结果在它们自己的列中,命名为Test\u 1\u Result,Test\u 2\u Result等。结果总是有序的,没有跳过(因此没有Test\u Result\u 4而没有Test\u Result\u 3) 数据帧中还可能有任意数量的其他非测试/结果列 下面是一个玩具示例: df <- data.frame(

我有一组数据帧,每个数据帧都有许多列。在每个数据帧中,一些列被命名为
Test_1
Test_2
Test_3
等,测试列的总数各不相同

一些(但不是全部!)测试有相关的结果。结果在它们自己的列中,命名为
Test\u 1\u Result
Test\u 2\u Result
等。结果总是有序的,没有跳过(因此没有
Test\u Result\u 4
而没有
Test\u Result\u 3

数据帧中还可能有任意数量的其他非测试/结果列

下面是一个玩具示例:

df <- data.frame(
  Name = c("A", "B", "C"),
  Test_1 = c("Standard", "Standard", "Standard"),
  Test_1_Result = c("Pass", "Fail", "Pass"),
  Test_2 = c("Sepcial", "Special", "Special"),
  Test_2_Result = c("Pass", "Fail", "Fail"),
  Test_3 = c("Unknown", "Unknown", "Unknown"),
  Test_4 = c(NA, NA, NA),
  Col_1 = c(1, 2, 3),
  Col_2 = c(1.2, 2.2, 3.2),
  Other_Col = c(1.3, 2.3, 3.3)
)
我想要的是这个(
Test_3
Test_4
删除)


df_target忽略列顺序的一个选项可以是:

df %>%
 select(which(duplicated(str_remove(names(.), "_Result"), fromLast = TRUE)),
        matches("^Name|_Result$|^Col|^Other_col"))

    Test_1  Test_2 Name Test_1_Result Test_2_Result Col_1 Col_2 Other_Col
1 Standard Sepcial    A          Pass          Pass     1   1.2       1.3
2 Standard Special    B          Fail          Fail     2   2.2       2.3
3 Standard Special    C          Pass          Fail     3   3.2       3.3

这一点也不优雅,但会删除所需的列。这假定
Test.*
Test.*\u结果
列的命名/结构一致

library(stringr)
library(dplyr)

test_cols <- str_remove(str_subset(names(df), "^Test_"), "_Result")
keep_these <- test_cols[duplicated(test_cols)]
drop_these <- test_cols[!test_cols %in% keep_these]
df %>% 
  select(-all_of(drop_these))

  Name   Test_1 Test_1_Result  Test_2 Test_2_Result Col_1 Col_2 Other_Col
1    A Standard          Pass Sepcial          Pass     1   1.2       1.3
2    B Standard          Fail Special          Fail     2   2.2       2.3
3    C Standard          Pass Special          Fail     3   3.2       3.3
库(stringr)
图书馆(dplyr)

test_cols对您来说,按与预期输出中相同的方式对列进行排序是否重要?@tmfmnk否,列顺序并不重要这是正确的方向,但手动输入要删除的列与手动输入要保留的列(或至少与之匹配的
列)进行交易,可能会有很多这样的列
df %>%
 select(which(duplicated(str_remove(names(.), "_Result"), fromLast = TRUE)),
        matches("^Name|_Result$|^Col|^Other_col"))

    Test_1  Test_2 Name Test_1_Result Test_2_Result Col_1 Col_2 Other_Col
1 Standard Sepcial    A          Pass          Pass     1   1.2       1.3
2 Standard Special    B          Fail          Fail     2   2.2       2.3
3 Standard Special    C          Pass          Fail     3   3.2       3.3
library(stringr)
library(dplyr)

test_cols <- str_remove(str_subset(names(df), "^Test_"), "_Result")
keep_these <- test_cols[duplicated(test_cols)]
drop_these <- test_cols[!test_cols %in% keep_these]
df %>% 
  select(-all_of(drop_these))

  Name   Test_1 Test_1_Result  Test_2 Test_2_Result Col_1 Col_2 Other_Col
1    A Standard          Pass Sepcial          Pass     1   1.2       1.3
2    B Standard          Fail Special          Fail     2   2.2       2.3
3    C Standard          Pass Special          Fail     3   3.2       3.3