从包含符号的连续数据中删除data.frame中的行

时间:2018-05-31 02:55:56

标签: r dataframe symbols

我有一个data.frame,其列应具有连续数据。但是,某些行的值为'〜'和'<'符号。

c.a <- c(1,5,3,7,4,9,2,3,7)
c.b <- c("a", "c", "f", "s", "r", "q", "w", "e", "t")
c.d <- c(1,4,6, '<5', '~34', 65, 45, 2, 6)
x <- data.frame(c.a, c.b, c.d)

目标是从data.frame x

中删除第4行和第5行

希望这不是一个重复的问题,但我做了一个快速搜索,无法找到解决方案。提前谢谢。

4 个答案:

答案 0 :(得分:2)

您可以尝试转换为数字并放弃那些非数字

x[!is.na(as.numeric(as.character(x$c.d))),]

输出:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6

答案 1 :(得分:2)

您可以使用grepl()过滤:

x[grepl(x=as.numeric(x$c.d),"[^\\d]"), ]

输出:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
4   9   q  65
5   2   w  45
6   3   e   2
7   7   t   6

答案 2 :(得分:1)

我认为,如果您未关闭stringsAsFactors = F,可能无法获得所需的结果,您可以在创建数据框时执行此操作:

x <- data.frame(c.a, c.b, c.d, stringsAsFactors=F)
x$c.d <- as.numeric(x$c.d)
x[complete.cases(x),]

您也可以在代码顶部执行options(stringsAsFactors=F),这可以在很多情况下帮助您(如果适合您,您可以选择使用)。

运行上述内容应该可以获得所需的输出。

您可以使用此解决方案(感谢@Onyambu):

na.omit(transform(x,c.d=as.numeric(c.d))) 

答案 3 :(得分:0)

转换the factor to a numericas.numeric(levels(x[, 'c.d']))[x[, 'c.d']]),然后将NA编入索引数据框:

x <- x[!is.na(as.numeric(levels(x[, 'c.d']))[x[, 'c.d']]), ]

这会产生一条警告信息(警告≠错误),你可以忽略它(由于转换非数字字符会产生NA,但这正是我们所说的那样)希望它在这里做。)

Warning message:
In `[.data.frame`(x, !is.na(as.numeric(levels(x[, "c.d"]))[x[, "c.d"]]),  :
  NAs introduced by coercion

这就是结果,就像你要求的那样:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6