r - 数据帧上下文中的模式匹配

标签 r pattern-matching dataframe

我有一个数据框,其前5行如下所示:

Sample    CCT6        GAT1                   IMD3          PDR3          RIM15
001       0000000000  111111111111111111111  010001000011  0N100111NNNN  01111111111NNNNNN
002       1111111111  111111111111111111000  000000000000  0N100111NNNN  00000000000000000
003       0NNNN00000  000000000000000000000  010001000011  000000000000  11111111111111111
004       000000NNN0  11100111111N111111111  010001000011  111111111111  01111111111000000
005       0111100000  111111111111111111111  111111111111  0N100111NNNN  00000000000000000

完整的数据集有2000个样本。我正在尝试编写代码,以使我能够确定所有示例中5列中每列的数字字符串是否均一(即全部为1或0)。理想情况下,在答案为True的情况下,我也希望能够区分1和0。从我的示例中,预期结果将是:
Sample    CCT6        GAT1         IMD3          PDR3          RIM15
001       TRUE (0)    TRUE (1)     FALSE         FALSE         FALSE
002       TRUE (1)    FALSE        TRUE (0)      FALSE         TRUE (0)
003       FALSE       TRUE (0)     FALSE         TRUE (0)      TRUE (1)
004       FALSE       FALSE        FALSE         TRUE (1)      FALSE
005       FALSE       TRUE (1)     TRUE (1)      FALSE         TRUE (0)

我不拘泥于使用逻辑,并且我可以使用字符,只要它们可以用于区分不同的类。理想情况下,id喜欢在相似的数据框中返回结果。

我在这里最基本的第一步遇到了麻烦,即让R判断字符串是否包含所有相同的值。香港专业教育学院尝试使用grepregexpr使用各种表达式,但无法获得结果,我可以使用ddply或类似方法将整个数据框应用到该结果。以下是我为该步骤尝试过的一些示例:
a = as.character("111111111111")
b = as.character("000000000000")
c = as.character("000000011110")


> grep("1",a)
[1] 1

> grep("1",c)
[1] 1

> regexpr("1",a)
[1] 1
attr(,"match.length")
[1] 1
> regexpr("1",c)
[1] 8
attr(,"match.length")
[1] 1

我非常感谢您提供的帮助,以帮助我开始解决这个问题或帮助我实现更大的目标。

最佳答案

这是一个完整的解决方案。可能矫kill过正,但也很有趣。

关键位是markTRUE函数。它使用反向引用(\\1)来引用先前由第一个带括号的子表达式匹配的子字符串(01)。

正则表达式"^(0|1)(\\1)+$"表示“匹配以01开头的任何字符串,然后(相同的字符)重复1个或多个重复(直到字符串的结尾),无论它是什么。”稍后,在对gsub()的相同调用中,我将使用相同的反向引用来替换"TRUE (0)""TRUE (1)"(视情况而定)。

首先读入数据:

dat <- 
read.table(textConnection("
Sample     CCT6        GAT1                   IMD3           PDR3          RIM15
001       0000000000  111111111111111111111  010001000011  0N100111NNNN  01111111111NNNNNN
002       1111111111  111111111111111111000  000000000000  0N100111NNNN  00000000000000000
003       0NNNN00000  000000000000000000000  010001000011  000000000000  11111111111111111
004       000000NNN0  11100111111N111111111  010001000011  111111111111  01111111111000000
005       0111100000  111111111111111111111  111111111111  0N100111NNNN  00000000000000000"),
header=T)

然后释放正则表达式:
markTRUE <- function(X) {
    gsub(X, pattern = "^(0|1)(\\1)+$", 
         replacement = "TRUE (\\1)")
}

markFALSE <- function(X) {
    X[!grepl("TRUE", X)]  <- "FALSE"
    return(X)
}

dat[-1] <- lapply(dat[-1], markTRUE)
dat[-1] <- lapply(dat[-1], markFALSE)

dat
#   Sample     CCT6     GAT1     IMD3     PDR3    RIM15
# 1      1 TRUE (0) TRUE (1)    FALSE    FALSE    FALSE
# 2      2 TRUE (1)    FALSE    FALSE    FALSE TRUE (0)
# 3      3    FALSE TRUE (0)    FALSE TRUE (0) TRUE (1)
# 4      4    FALSE    FALSE    FALSE TRUE (1)    FALSE
# 5      5    FALSE TRUE (1) TRUE (1)    FALSE TRUE (0)

关于r - 数据帧上下文中的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911522/

相关文章:

r - 使用朴素贝叶斯来预测新值

java - 正则表达式排除行为

r - 使用 `data.table` 和/或 `Rcpp` 将 `RcppArmadillo` 传递给 C++ 函数

r - igraph 中的地理布局

lm 使用插入符号火车的结果

grep - 打印具有匹配模式的行,从匹配的模式开始

c++ - 仅 block 的 HoG 特征

r - 动物园对象聚合

python - 选择多级索引数据框中的行,其索引值等于 pandas 中另一个数据框中的列

python - DataFrame Pandas 显示 NAN