在R中使用一些相似的词对数据进行排序

在R中使用一些相似的词对数据进行排序,r,tidyverse,R,Tidyverse,我有一个100列的数据库,但我的数据的最小生成量如下: df1给定示例数据,您可以只查找数字4或5 df1%>% 选择匹配4 | 5 >KO4S4AW KOM4S4zo KO5S5AW KOM5S5zo > 1 0 4 0 5 > 2 0 3 0 1 > 3 1 4 0 2 > 4 0 5 0

我有一个100列的数据库,但我的数据的最小生成量如下:


df1给定示例数据,您可以只查找数字4或5

df1%>% 选择匹配4 | 5 >KO4S4AW KOM4S4zo KO5S5AW KOM5S5zo > 1 0 4 0 5 > 2 0 3 0 1 > 3 1 4 0 2 > 4 0 5 0 1 > 5 0 1 3 4
根据示例数据,您可以只查找数字4或5

df1%>% 选择匹配4 | 5 >KO4S4AW KOM4S4zo KO5S5AW KOM5S5zo > 1 0 4 0 5 > 2 0 3 0 1 > 3 1 4 0 2 > 4 0 5 0 1 > 5 0 1 3 4
目前还不完全清楚这些模式。我们创建一个函数f1来提取'KOM'或|'PG'后面的一个或多个数字\\d+,并使用str|u从stringr中提取,转换为数字'v1',类似地,提取'S'v2'后面的数字。请检查这些值是否相同,如果其中一个值大于3,请使用该值进行换行,以便在删除任何NAs时,如果有任何由str_extract产生的NAs将被删除,因为这将提供列索引。使用select中的函数选择遵循该模式的列

library(dplyr)
library(stringr)
f1 <- function(nm) {
  v1 <- as.numeric(str_extract(nm, "(?<=(KOM|PG))\\d+"))
  v2 <- as.numeric(str_extract(nm, "(?<=S)\\d+"))
   nm[which((v1 == v2) & (v1 > 3))]
 }

df1 %>%
     select(f1(names(.)))
#   PG4S4AW KOM4S4zo PG5S5AW KOM5S5zo
#1       0        4       0        5
#2       0        3       0        1
#3       1        4       0        2
#4       0        5       0        1
#5       0        1       3        4
数据
目前还不完全清楚这些模式。我们创建一个函数f1来提取'KOM'或|'PG'后面的一个或多个数字\\d+,并使用str|u从stringr中提取,转换为数字'v1',类似地,提取'S'v2'后面的数字。请检查这些值是否相同,如果其中一个值大于3,请使用该值进行换行,以便在删除任何NAs时,如果有任何由str_extract产生的NAs将被删除,因为这将提供列索引。使用select中的函数选择遵循该模式的列

library(dplyr)
library(stringr)
f1 <- function(nm) {
  v1 <- as.numeric(str_extract(nm, "(?<=(KOM|PG))\\d+"))
  v2 <- as.numeric(str_extract(nm, "(?<=S)\\d+"))
   nm[which((v1 == v2) & (v1 > 3))]
 }

df1 %>%
     select(f1(names(.)))
#   PG4S4AW KOM4S4zo PG5S5AW KOM5S5zo
#1       0        4       0        5
#2       0        3       0        1
#3       1        4       0        2
#4       0        5       0        1
#5       0        1       3        4
数据