我有一个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行希望这不是一个重复的问题,但我做了一个快速搜索,无法找到解决方案。提前谢谢。
答案 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 numeric(as.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