我有一个大型数据集,其中一列包含两个字符(即" A"," B"等)和数字,但数字是读入和假设的也是人物。我想摆脱这一列的单元格是一个数字的所有行。为简单起见,我将只显示一个模拟向量,表示我对该列的问题。
例如,
data<-c("A","A","B","B","1","2","-2")
这是我继承的数据和一个大数据集 - 是否有一种很好的方法来解析/删除数字1,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.-]+$
如果列为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
。