我正在尝试从不同的列中获取值,但是在字符串中的相同位置。列值如下所示:
"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/1
和1/1
我尝试以下行,但它不起作用。该行返回空的data.frame
0 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。
答案 0 :(得分:1)
您需要混合使用正则表达式和列的连接
df1 <- dplyr::filter(df, grepl(paste(c("0/1", "1/0"), collapse = "|"),
paste(column1, column2, sep = "_")))
答案 1 :(得分:0)
假设以下输入数据:
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