R使用不包含单个值的单元格删除数据框中的行

时间:2015-08-28 18:24:44

标签: r dataframe

我有一个数据框,我希望删除某些列中包含多个值的行。

使用以下示例数据:

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}),]我觉得应该可以使用,但我的代码中似乎存在一个问题,我目前看不到它。

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