2013-02-14 24 views
11

Sau khi nhập một bảng từ Wikipedia, tôi có một danh sách các giá trị của các hình thức sau đây:Tôi có thể sử dụng gsub() trên mỗi phần tử của một khung dữ liệu không?

> 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%" 

tôi đang cố gắng để thoát khỏi những dấu hiệu phần trăm, để chuyển đổi dữ liệu sang dạng số.

Có cách nào nhanh hơn để làm sạch dữ liệu này hơn là đi vectơ hóa không? mã hiện tại của tôi sau:

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

Dữ liệu cuối cùng trở thành một khung dữ liệu, nhưng tôi không thể có được gsub để hoạt động đúng trên tất cả các yếu tố của một khung dữ liệu. Có cách nào để gsub() mỗi phần tử của một khung dữ liệu không?

The code for the project is online, with results. Cảm ơn bạn trước!

+1

Đó là nhiều khả năng chỉ là một danh sách hơn một khung dữ liệu. Và ... lapply cũng sẽ làm việc với dataframes vì ​​chúng thực sự là danh sách với các thuộc tính đặc biệt. –

+0

Đây là danh sách. Nhưng 'gsub' không hoạt động khi tôi cần nó trên nó (' lapply' hoạt động tốt). –

+1

Bởi vì data.frames là các danh sách đặc biệt và bạn có một phương pháp thử nghiệm cho danh sách, điều này hầu như chắc chắn sẽ hoạt động: 'dfrm <- as.data.frame (lapply (tbl [2: 6], FUN = function (x) as .numeric (gsub ("%", "", x)))) ' –

Trả lời

11

Vâng, tôi nghĩ bạn có thể làm điều đó theo cách sau, nhưng tôi không biết nếu nó là tốt hơn hoặc sạch hơn của bạn:

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

Mà cho:

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

Điều này làm việc tốt nhất cho tôi, nó ngắn hơn và dễ đọc hơn. Tôi đã cập nhật mã để xác nhận –

+0

Ah tốt, cảm ơn các khoản tín dụng.Tôi sẽ đưa bạn như đồng-atuhor của gói của tôi trong trở lại :) – juba

+0

[off-topic] Cảm ơn! Tôi đang lập kế hoạch nhiều chức năng như một trong những tôi đã gửi. được trực tiếp lấy cảm hứng từ các lệnh Stata mà tôi thấy hữu ích nhất để phân tích các cuộc điều tra [về chủ đề] Nó xảy ra khá thường xuyên để có một khung dữ liệu trong đó tất cả các cột nhưng một được định dạng theo cùng một cách. sẽ hoạt động giống như 'melt' (với đối số' id.vars') cho các loại hoạt động này. –

4

Giống như Juba tôi 'không chắc chắn nếu cách này là "tốt hơn hoặc sạch hơn" nhưng ... để hành động trên tất cả các yếu tố của một khung dữ liệu, bạn có thể sử dụng áp dụng:

# 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))) 
Các vấn đề liên quan