根据列名中的数字选择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