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

R remove numbers in data frame entries containing only numbers

提问人:sushi 提问时间:12/2/2017 最后编辑:sushi 更新时间:1/30/2019 访问量:16466

问:

我正在从在线 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

我想删除城市列中只有数字的行。Kent 98042 和 98042 Kent 都可以,因为它包含城市名称,但由于 98125 不是城市,我删除了该行。

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

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

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

City        Population   Foo   Bar
Seattle     10           foo1  bar1

"Kent 98042"即使我想保留那一行,也被删除了。 建议?请,谢谢!

R 正则表达式 DataFrame 筛选器 DPLYR

评论

0赞 cparmstrong 12/2/2017
你想在文本之后保留这些数字吗?例如,在您期望的输出中,第三个观测值是否必须是“Kent 98042”,或者“Kent”是否正常?
0赞 storaged 12/2/2017
尝试添加字符串的强制开头grepl("^[0-9]+", cities.data)
1赞 sushi 12/2/2017
我不需要城市后面的数字,只有“肯特”就可以了,但我认为这样做可能更难。&哦,对不起,我忘了包括一个数字在城市前面的例子,例如“98042 Kent”,其中“^”不起作用,因为它消除了该行。
0赞 cparmstrong 12/2/2017
@siushi我刚刚在下面添加了一个解决方案,该解决方案可以在删除所有数字的同时解决它,并且还应该处理文本之前的情况。

答:

4赞 AntoniosK 12/2/2017 #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.numericNA

如果要使用基础 R,可以使用以下命令:df[is.na(as.numeric(df$City)),]

1赞 Jan 12/2/2017 #2

带普通: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+$

评论

0赞 sushi 12/2/2017
谢谢!我不太擅长正则表达式,也不知道我可以锚定表达式的末端。
4赞 cparmstrong 12/2/2017 #3

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

# 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赞 sushi 12/2/2017
谢谢!这很棒,因为它比我想要的领先一步。
1赞 cparmstrong 12/2/2017
太棒了!,很高兴我能帮上忙!如果这是你用的那个,我将不胜感激你接受我的回答。