问题 我可以在数据框的每个元素上使用gsub()吗?


从Wikipedia导入表后,我有一个以下形式的值列表:

    > 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()数据框的每个元素?

该项目的代码是在线的,带有结果。 提前致谢!


1639
2018-02-14 09:11


起源

这更像是一个列表而不是数据帧。而且...... lapply也可以使用数据帧,因为它们实际上是具有特殊属性的列表。 - 42-
这是一个清单。但 gsub 不起作用,因为我需要它(lapply 工作正常)。 - Fr.
因为data.frames是特殊列表,并且您有一个经过测试的列表方法,所以这几乎肯定会起作用: dfrm <- as.data.frame(lapply(tbl[2:6], FUN = function(x) as.numeric(gsub("%", "", x))) ) - 42-
事实上,这会起作用,但我试图在没有矢量化的情况下,保持在水平 as. 用于获取清洁形状的数据。你的论点完全正确。 - Fr.
@BondedDust我在我的数据框上使用了lapply和gsub,现在所有列都转换为factor。试图转换回数字并看到这篇文章: stackoverflow.com/questions/3418128/... 还有其他想法吗? - vagabond


答案:


好吧,我认为你可以通过以下方式实现,但我不知道它是否比你的更好或更清洁:

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" 

11
2018-02-14 09:17



这对我来说效果最好,它既简短又易于阅读。我已更新代码以确认它。 - Fr.
好吧,谢谢你的学分。我会把你作为我的包裹的合作伙伴作为回报:) - juba
[偏离主题]谢谢!我正在计划更多功能,比如我提交的功能。他们中的大多数直接受到Stata命令的启发,我发现这些命令对于分析调查最有用。 [on-topic]经常会出现一个数据框,其中所有列都以相同的方式格式化。我也在考虑编写一个有点像常规的例行程序 melt (与 id.vars 这些操作的论点)。 - Fr.


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

# 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)))

4
2018-02-14 10:18