【问题标题】:Select rows by multiples conditions at columns按列的倍数条件选择行
【发布时间】:2018-09-19 18:16:38
【问题描述】:

我试图从不同的列中获取一个值,但在字符串中的相同位置。列值如下所示:

"0/1:15,0,52:3:13"
"1/0:15,0,52:3:13"
"0/0:15,0,52:3:13"
"1/1:15,0,52:3:13"

我想通过0/1 过滤并通过data.frame 获取与该条件匹配的所有行。为此我可以使用:

df1 <- dplyr::filter(df, grepl("0/1", nameofthecolumn))

它可以工作,但是当我尝试按 2 个条件(如0/11/1)进行过滤时,我尝试以下行但它不起作用。该行返回一个空的data.frame0 obs. of X variables

df1 <- dplyr::filter(df, grepl(paste("0/1", "1/1"), paste("namesofthecolumn1", "nameofthecolumn2"))

然后我需要修复该函数并为不同的列设置不同的条件,如果一行(X 列的同一行)包含0/1,另一列1/1 和另一个“0/0”,计数所有的 1,所以我得到了值:3

那我要问两个问题:

1 - 如何修复我的行以按条件列表和列列表进行过滤?

2 - 如何通过列列表对一行中的所有 1 进行求和/计数?

任何帮助将不胜感激。

编辑:

data.frame 工作示例:

column1 <- c("0/1:15,0,52:3:13", "1/1:152,144,0,132,107,129:49:99", "0/1:26,0,7:54:10", "0/0:0,12,115:4:14", "1/1:219,57,0:19:99", "0/0:0,21,255:96:21")
column2 <- c("1/1:15,0,52:3:13", "1/1:152,144,0,132,107,129:49:99", "0/1:26,0,7:54:10", "0/1:0,12,115:4:14", "0/0:219,57,0:19:99", "0/0:0,21,255:96:21")
chrom <- c("chr0", "chr0", "chr1", "chr1", "chr2", "chr2")
df <- data.frame(chrom, column1, column2)

我想过滤例如 0/1 和 1/1,所以我得到所有至少有 0/1 或 1/1 的行:

chrom   column1             colum2
chr 0   0/1:15,0,52:3:13    1/1:15,0,52:3:13
chr 0   1/1:152,144,0,132,107,129:49:99    1/1:152,144,0,132,107,129:49:99
chr 1   0/1:26,0,7:54:10    0/1:26,0,7:54:10
chr 1   0/0:0,12,115:4:14   0/1:0,12,115:4:14
chr 2   1/1:219,57,0:19:99  0/0:219,57,0:19:99

我得到了除最后一行之外的所有行,因为最后一行不包含 0/1 或 1/1。

【问题讨论】:

  • 您不能简单地删除第一个 , 之前子字符串中 : 之前的所有内容吗?或者您可以构建一个管道,在其中提取 : 之前的子字符串,并创建一种用于过滤或其他任何内容的“主键”列
  • 删除元素这不是一个选择,因为我需要每一行中每一列的完整字符串。
  • 这个想法是有一个data.frame,其中每一行都是像c("0/1", "0/1:15,0,52:3:13")这样的向量。所以你没有删除任何东西,你只需使用0/1 来做你需要的操作。但是,我无法写出答案,因为我没有真正理解您的问题,因为您既没有共享输入数据,也没有共享预期的输出。
  • 这只是过滤并获取所有具有列值"0/1:15,0,52:3:13"的X列值如“0/1”或c(“0/1”,“1/1”)的行并获得一个包含所有这些过滤行的 data.frame。
  • 我想得到一个data.frame,看我最后一个回答的遗言

标签: r filter dplyr


【解决方案1】:

您需要混合使用正则表达式和列的串联

df1 <-  dplyr::filter(df, grepl(paste(c("0/1", "1/0"), collapse = "|"), 
                                paste(column1, column2, sep = "_")))

【讨论】:

    【解决方案2】:

    假设输入数据如下:

    input <- c("0/1:15,0,52:3:13", "1/0:15,0,52:3:13", "0/0:15,0,52:3:13", "1/1:15,0,52:3:13")
    

    让我们获得一个只包含我们将用于过滤的元素的向量:

    key <- unlist(lapply(strsplit(unlist(lapply(strsplit(input, ","), "[[", 1)), ":"), "[[", 1))
    

    此时我们创建了一个包含两列的 data.frame:用于过滤的值和我们要过滤的输入数据。请注意,输入数据是带有整个字符串的原始向量。

    df <- data.frame(key = key, input = input,
                     stringsAsFactors = FALSE)
    

    最后,我们可以使用key 列来根据您喜欢的条件过滤输入数据。输出是一个 data.frame,只有一列包含过滤的输入数据:

    result <- data.frame(df[df$key %in% c("0/1", "1/1"), -1])
    
    print(result)
    
                 value
    1 0/1:15,0,52:3:13
    2 1/1:15,0,52:3:13
    

    【讨论】:

    • 对不起,如果我不是很清楚,我要过滤的数据将是具有以下值的列的列表:"0/1:15,0,52:3:13",我想要获取的 data.frame 是 df 行与具有“0/1”和“1/1”的其他列匹配。
    • 我建议你提供一个可重复的例子,一个清晰的问题解释和一个简洁的问题来回答,否则很难有人可以帮助你
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多