首页 > 解决方案 > 仅提取带有应用和子中断的字符串列的数字部分

问题描述

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 ...

标签: r

解决方案


一个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 

推荐阅读