r - 仅提取带有应用和子中断的字符串列的数字部分
问题描述
我dat
在 R 中有一个数据框,如下所示:
id x y z
1 0 4 California 15 MSG 2017/11
2 0 1 Nationally Representative 11 MSG 2016/04
3 1 1 Nationally Representative 8 MSG 2016/01
4 0 1 Nationally Representative 1 ASDE 2014/01
5 2 1 Nationally Representative 8 MSG 2016/01
6 0 1 Nationally Representative 5 MSG 2015/07
现在我想遍历每一列,只保留开头的数字部分,例如在第一行,变量x,我想保留“4”,变量z我想保留“15”等等。
我尝试了以下方法(即在每列中搜索空格字符并将其删除+空格后的部分):
dat_new = apply(dat, 2, function(x) sub(" .+", "", x)) # searchs for any space and deletes the space + everything after the space
dat_new = as.data.frame(apply(dat_new, 2, as.numeric))
但是,对于一小部分数据(例如前六行)有效的方法最终会中断。即,我的总数据框有 5100 行,并且应用上述函数导致第一列(“id”)变空,这也发生在其他一些列上。我目前找到了使用实际 for 循环的解决方法,但仍想检查我的代码有什么问题以及是否有另一个优雅的解决方案。
的数据类型dat
有:
'data.frame': 5109 obs. of 4 variables:
$ id: int 1 2 3 4 5 6 7 8 9 10 ...
$ x : int 0 0 1 0 2 0 1 1 0 0 ...
$ y : Factor w/ 4 levels "1 Nationally Representative",..: 4 1 1 1 1 1 1 4 1 3 ...
$ z : Factor w/ 16 levels "1 ASDE 2014",..: 7 3 15 1 15 12 12 8 13 5 ...
解决方案
一个apply
实现(可能很慢):
as.data.frame(apply(dat,2,function(x) gsub("[A-Z].*","",x)))
d x y z
1 1 0 4 15
2 2 0 1 11
3 3 1 1 8
4 4 0 1 1
5 5 2 1 8
6 6 0 1 5
推荐阅读
- python - Python以二进制打印浮点数?
- javascript - 命令应该在调用命令后删除作者的消息,而是垃圾邮件聊天 [discord.js]
- c++ - 使用 basic_ofstream 写入字节数据序列
- python - Tweepy 流式传输错误,从用户目标中删除推文后收到通知错误“id”
- c# - 将分隔字符串数组转换为 ValueTuple 列表
- javascript - Discord guilds.join OAuth2 in JS
- css - 修改css以免改变文字颜色
- vuforia - 模型目标 Vuforia Studio
- c# - 识别图像不属于其他 2 个预测模式 ML.NET
- entity-framework - Dotnet Core - 实体框架 - 在这种情况下,空大括号是什么意思,结果是什么