如何排除(删除)字符列中数字的单元格值

时间:2015-01-07 20:10:19

标签: r subset

我有一个大型数据集,其中一列包含两个字符(即" A"," B"等)和数字,但数字是读入和假设的也是人物。我想摆脱这一列的单元格是一个数字的所有行。为简单起见,我将只显示一个模拟向量,表示我对该列的问题。

例如,

data<-c("A","A","B","B","1","2","-2")

这是我继承的数据和一个大数据集 - 是否有一种很好的方法来解析/删除数字1,2,-2作为字符读入?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

一个简单的选择是:

data <- droplevels(data[is.na(suppressWarnings(as.numeric(data$col))), ])

将列(col)转换为数字并将那些转换为NA的值子集(这意味着它们不是数字)。然后,丢弃不再使用的因子级别。

一些示例用法:

v1 <- c('A12', 'AB12', '-2.53', '25.29', 'BCd')
v1[is.na(suppressWarnings(as.numeric(v1)))]
#[1] "A12"  "AB12" "BCd"

或使用特殊字符:

v1 <- c('A_12', 'AB12', '-2.53', '25.29', 'B-Cd')
v1[is.na(suppressWarnings(as.numeric(v1)))]
#[1] "A_12" "AB12" "B-Cd"

答案 1 :(得分:0)

下面是一个简单的regex选项。在这里,我使用grepl通过删除具有从字符串的开头(^)到结尾($)开始的数字的元素来对数据集进行子集化。

subdat <- droplevels(data[!grepl('^[0-9.-]+$', data$yourCol),])

可视化

^[0-9.-]+$

Regular expression visualization

Debuggex Demo

如果列为factor,您可以使用droplevels删除级别,也可以再次使用factor删除未使用的&#34;水平。然后,检查&#34; yourCol&#34; &#34;数据&#34;按levels(data$yourCol)。另一种选择是转换为&#34;字符&#34;列data$yourCol <- as.character(data$yourCol)并使用unique(data$yourCol)

使用一些示例数据进行测试

 v1 <- c('A12', 'AB12', '-2.53', '25.29', 'BCd', '-12AB5', '-AB125', '- ')
 v1[!grepl('^[0-9.-]+$', v1)]
 #[1] "A12"    "AB12"   "BCd"    "-12AB5" "-AB125" "- "    

使用@docendodiscimus代码进行双重检查

 v1[is.na(suppressWarnings(as.numeric(v1)))]
 #[1] "A12"    "AB12"   "BCd"    "-12AB5" "-AB125" "- "    

注意:我发现初始版本在某些情况下可能无效后我确实更新了regex