保留doubled列,在data.frame中只有2个字母不同

时间:2015-07-14 06:36:26

标签: r

我在R中有一个数据框,它包含大约100列。大多数列都加倍,但2个字母不同。我想保留这些列并删除那些没有加倍的列。

以下是一个例子:

234-rgz SK    234-rgz PV    556-gft SK    456-hjk SK    456-hjk PV  

输出应为:

234-rgz SK    234-rgz PV    456-hjk SK    456-hjk PV

所有列都具有相同的命名约定。从2到150之后的数字,然后在这4或5个字母后面的“ - ”,然后是空格,然后是“SK”或“PV”。我想过使用正则表达式但是我没有解决问题我是如何摆脱那些单列的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

删除后缀部分后,可以在列名称上使用duplicated。输出将是逻辑索引,可用于subset原始数据集。

v1 <- colnames(df1)
v2 <- sub('\\s+[^ ]+$', '', v1)
indx <- duplicated(v2)|duplicated(v2, fromLast=TRUE)
v1[indx]
#[1] "234-rgz SK" "234-rgz PV" "456-hjk SK" "456-hjk PV"

要对数据框中的列进行子集化,

df1[indx]

或者另一种选择是将列名字符串拆分为子字符串,并使用grep匹配频率> 1的子字符串

 tbl <- table(unlist(strsplit(v1, '\\s+.*')))
 df1[grep(paste(names(tbl)[tbl>1], collapse="|"), v1)]

数据

set.seed(24)
df1 <- as.data.frame(matrix(sample(0:9, 5*10, replace=TRUE), ncol=5, 
 dimnames=list(NULL, c('234-rgz SK',  '234-rgz PV' ,   '556-gft SK', 
   '456-hjk SK' ,   '456-hjk PV') )) )