我有一个数据框,我希望删除某些列中包含多个值的行。
使用以下示例数据:
my.data <- structure(list(alts = structure(c(2L, 16L, 8L), .Label = c("A",
"C", "c(\"\", \"A\")", "c(\"A\", \"\")", "c(\"\", \"C\")", "c(\"C\", \"\")",
"c(\"C\", \"C,G\")", "c(\"C,G\", \"G\")", "c(\"\", \"G\")", "c(\"G\", \"\")",
"c(\"G\", \"A\")", "c(\"\", \"T\")", "c(\"T\", \"\")", "c(\"\", \"T\", \"C\")",
"G", "T"), class = "factor"), Coordinate = c(13687520L, 13687570L,
13687591L), `3115` = c("C", "T", "C,G"), `3124` = c("C", "T",
"C,G"), `9582` = c("C", "T", "C,G"), `9583` = c("C", "T", "C,G"
), `9584` = c("C", "T", "G"), `9585` = c("C", "T", "C,G"), `9586` = c("C",
"T", "C,G"), `9587` = c("C", "T", "C,G"), `9588` = c("C", "T",
"C,G"), `9590` = c("C", "T", "C,G"), `9592` = c("C", "T", "C,G"
), `9593` = c("C", "T", "C,G"), `9594` = c("C", "T", "G"), `9595` = c("C",
"T", "C,G"), `9596` = c("C", "T", "C,G"), `9597` = c("C", "T",
"C,G"), `9598` = c("C", "T", "C,G"), `9599` = c("C", "T", "C,G"
), `9600` = c("C", "T", "C,G"), `9601` = c("C", "T", "C,G")), .Names = c("alts",
"Coordinate", "3115", "3124", "9582", "9583", "9584", "9585",
"9586", "9587", "9588", "9590", "9592", "9593", "9594", "9595",
"9596", "9597", "9598", "9599", "9600", "9601"), row.names = 324:326, class = "data.frame")
我希望检查第3至22列,并在满足上述条件时删除。即应删除第三行。
我尝试过:my.desired.data <- <- my.data[!apply(my.data[,3:22], 1, function(x) {any(as.character(nchar(x))) != 1}),]
我觉得应该可以使用,但我的代码中似乎存在一个问题,我目前看不到它。
答案 0 :(得分:1)
我们使用lapply
遍历第3:22列,使用,
检查grepl
以返回逻辑list
元素。将Reduce
与|
一起使用,并取消!
,以便为只有一个元素的行返回TRUE
。这可用于对“我的数据”进行子集化。
my.data[!Reduce(`|`,lapply(my.data[3:22], grepl, pattern=',')),]
# alts Coordinate 3115 3124 9582 9583 9584 9585 9586 9587 9588 9590 9592 9593
#324 C 13687520 C C C C C C C C C C C C
#325 T 13687570 T T T T T T T T T T T T
# 9594 9595 9596 9597 9598 9599 9600 9601
#324 C C C C C C C C
#325 T T T T T T T T