我在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”。我想过使用正则表达式但是我没有解决问题我是如何摆脱那些单列的。谢谢你的帮助!
答案 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') )) )