我正在从在线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"
已删除,即使我想保留该行。
建议?拜托,谢谢!
答案 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+$
(仅限数字)并从集合中删除这些数字。注意两边的锚点。