2013-02-14 30 views
11

维基百科导入表之后,我有以下形式的值的列表:我可以在数据框的每个元素上使用gsub()吗?

> tbl[2:6] 
    $`Internet 
    Explorer` 
    [1] "30.71%" "30.78%" "31.23%" "32.08%" "32.70%" "32.85%" "32.04%" "32.31%" "32.12%" "34.07%" "34.81%" 
    [12] "35.75%" "37.45%" "38.65%" "40.63%" "40.18%" "41.66%" "41.89%" "42.45%" "43.58%" "43.87%" "44.52%" 

    $Chrome 
    [1] "36.52%" "36.42%" "35.72%" "34.77%" "34.21%" "33.59%" "33.81%" "32.76%" "32.43%" "31.23%" "30.87%" 
    [12] "29.84%" "28.40%" "27.27%" "25.69%" "25.00%" "23.61%" "23.16%" "22.14%" "20.65%" "19.36%" "18.29%" 

我试图摆脱的百分比符号,以将数据转换成数字形式。

有没有更快的方法来清理这些数据比去矢量化?我当前的代码如下:

data <- lapply(tbl[2:6], FUN = function(x) as.numeric(gsub("%", "", x))) 

数据最终成为一个数据帧,但我不能让gsub跨数据帧中的所有元素正常工作。 有没有办法让gsub()数据框的每个元素?

The code for the project is online, with results.在此先感谢!

+1

这更可能只是一个列表而不是数据框。并且... lapply也将使用数据框,因为它们实际上是具有特殊属性的列表。 – 2013-02-14 10:52:31

+0

这是一个列表。但'gsub'不工作,因为我需要它('lapply'工作正常)。 – 2013-02-14 10:55:46

+1

因为data.frames是特殊的列表,你有一个列表测试方法,这几乎肯定会奏效:'dfrm < - as.data.frame(lapply(tbl [2:6],FUN = function(x)as .nu​​meric(gsub(“%”,“”,x))))' – 2013-02-14 11:42:04

回答

11

嗯,我想你可以做下面的方式,但我不知道这是否是比你的好或清洁剂:

df <- data.frame(tbl) 
df[,-1] <- as.numeric(gsub("%", "", as.matrix(df[,-1]))) 

其中给出:

R> head(df) 
      Date Internet.Explorer Chrome Firefox Safari Opera Mobile 
1 January 2013    30.71 36.52 21.42 8.29 1.19 14.13 
2 December 2012    30.78 36.42 21.89 7.92 1.26 14.55 
3 November 2012    31.23 35.72 22.37 7.83 1.39 13.08 
4 October 2012    32.08 34.77 22.32 7.81 1.63 12.30 
5 September 2012    32.70 34.21 22.40 7.70 1.61 12.03 
6 August 2012    32.85 33.59 22.85 7.39 1.63 11.78 
R> sapply(df, class) 
      Date Internet.Explorer   Chrome   Firefox 
     "factor"   "numeric"   "numeric"   "numeric" 
      Safari    Opera   Mobile 
     "numeric"   "numeric"   "numeric" 
+0

这对我来说最好,它既简短又易于阅读。 – 2013-02-14 20:09:29

+0

好的,谢谢你的信用,我会把你作为我的包裹的回报:) – juba 2013-02-15 07:59:03

+0

[离题]谢谢!我正在计划更多的功能,比如我提交的功能。直接受Stata命令的启发,我发现这些命令对于分析调查非常有用[on-topic]有一个数据框,其中除了一个以外的所有列的格式都是相同的,我也在考虑编写一些常规这对于这些类型的操作有点像'melt'(带有'id.vars'参数)。 – 2013-02-16 01:57:14

4

像朱巴我不确定这种方式是“更好还是更干净”,但是......对数据帧的所有元素采取行动,可以使用apply

# start with data frame, not list 
url <- "http://en.wikipedia.org/wiki/Usage_share_of_web_browsers" 
# Get the eleventh table. 
tbl <- readHTMLTable(url, which = 11, stringsAsFactors = F) 

# use apply on the non-date columns 
tbl[, 2:7] <- apply(tbl[, 2:7], 2, function(x) as.numeric(gsub("%", "", x))) 
相关问题