R 我可以在数据帧的每个元素上使用gsub()吗?
从Wikipedia导入一个表后,我有一个如下形式的值列表:R 我可以在数据帧的每个元素上使用gsub()吗?,r,R,从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%" "
> 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)))
数据我想你可以用下面的方法来做,但我不知道它是比你的更好还是更干净:
df <- data.frame(tbl)
df[,-1] <- as.numeric(gsub("%", "", as.matrix(df[,-1])))
像juba一样,我不确定这种方式是否“更好或更干净”,但是……要对数据帧的所有元素起作用,可以使用apply:
#从数据框开始,而不是列表
更像是列表而不是数据帧的url。而且。。。lapply还将处理数据帧,因为它们实际上是具有特殊属性的列表。但是gsub
不能像我需要的那样在上面工作(lappy
很好)。因为data.frames是特殊的列表,并且你有一个经过测试的列表方法,这几乎肯定会起作用:dfrm确实可以,但我尝试不使用矢量化,保持在as的级别。
函数用于获取数据以进行清理。您的参数在其他方面是完全正确的。@BondedDust我在数据帧上使用了Lappy和gsub,所有列现在都转换为因子。试图转换回数字,看到了这篇文章:还有其他想法吗?这对我来说最合适,它既短又容易阅读。我已经更新了代码来确认它。啊,好吧,谢谢你的信用卡。作为回报,我会让你作为我包裹的共同收件人:)[话题之外]谢谢!我正在计划更多类似于我提交的功能。他们中的大多数人都直接受到Stata命令的启发,我发现这些命令对分析调查最有用。[on topic]经常会有一个数据框,其中除一列外,所有列的格式都相同。我也在考虑为这类操作编写一个类似于melt
(带有id.vars
参数)的小例程。
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"
# 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)))