R删除仅包含数字的数据框条目中的数字

时间:2017-12-01 22:21:14

标签: r regex dataframe filter dplyr

我正在从在线csv文件中读取数据框,但是创建该文件的人不小心将一些数字输入到列中,该列应该只是城市名称。 cities.data表的样本。

City        Population   Foo   Bar
Seattle     10           foo1  bar1
98125       20           foo2  bar2
Kent 98042  30           foo3  bar3
98042 Kent  30           foo4  bar4

删除城市列中仅包含数字的行后所需的输出:

City        Population   Foo   Bar
Seattle     10           foo1  bar1
Kent 98042  30           foo3  bar2
98042 Kent  30           foo4  bar4

我想删除city列中只有ONLY数字的行。肯特98042和98042肯特都没关系,因为它包含城市名称,但由于98125不是一个城市,我删除了那一行。

我无法使用is.numeric因为该号码在csv文件中被读取为字符串。我尝试使用正则表达式,

cities.data <- cities.data[which(grepl("[0-9]+", cities.data) == FALSE)]

但是这会删除任何数字的行,而不仅仅是只包含数字的行,例如

City        Population   Foo   Bar
Seattle     10           foo1  bar1

"Kent 98042"已删除,即使我想保留该行。 建议?拜托,谢谢!

3 个答案:

答案 0 :(得分:2)

如果您根本不需要城市列中的数字:

# replace all numbers with empty string
cities.data$City <- gsub("[0-9]+", "", cities.data$City) 
# drop observations that are only empty strings
cities.data <- cities.data[cities.data$City!="",]  

编辑:这应该处理更新示例中的所有情况,其中数字可以在字符串中的任何位置。

答案 1 :(得分:1)

df = read.table(text = "
City        Population   Foo   Bar
Seattle     10           foo1  bar1
98125       20           foo2  bar2
Kent98042  30           foo3  bar2
", header=T, stringsAsFactors=F)

library(dplyr)

df %>% filter(is.na(as.numeric(City)))

#        City Population  Foo  Bar
# 1   Seattle         10 foo1 bar1
# 2 Kent98042         30 foo3 bar2

我们的想法是,当我们将as.numeric应用于字符变量时,只有当它是一个数字时才会返回NA值。

如果您想使用基础R,可以使用:df[is.na(as.numeric(df$City)),]

答案 2 :(得分:1)

使用普通R

df <- data.frame(City = c('Seattle', '98125', 'Kent 98042'),
                 Population = c(10, 20, 30),
                 Foo = c('foo1', 'foo2', 'foo3'))
df2 <- df[-grep('^\\d+$', df$City),]
df2

这会产生

        City Population  Foo
1    Seattle         10 foo1
3 Kent 98042         30 foo3

<小时/> 我们的想法是查找^\d+$(仅限数字)并从集合中删除这些数字。注意两边的锚点。