2014-11-26 30 views
5

Nếu tôi có một khung dữ liệu:Chuyển đổi dấu chấm dấu phẩy trong số

a b 
2.4 4.6 
3.6 66.7 
5.8 44.6 

Cả a và b là số.

Tôi muốn chuyển đổi "." đến "" với

df$a <- as.numeric(gsub(".", ",", df$a)) 

nhưng tôi luôn có được

Warning message:NAs introduced by coercion 

và tất cả các giá trị được chuyển đổi sang NA. Tại sao?

+0

Bạn có nghĩa là bạn vẫn muốn các giá trị số, nhưng bạn muốn '.' là', '? –

+0

Chính xác. Điều đó có thể không? –

+0

Phần Lan (Phần Lan). Và dấu phân cách thập phân là dấu phẩy. –

Trả lời

14

Ý tưởng ban đầu của bạn gần như chính xác, chỉ biểu thức chính quy là sai, vì . khớp với bất kỳ biểu tượng nào. Bạn cần một cái gì đó như (điều này sẽ chuyển đổi vector số thành một vector ký tự)

df$a <- gsub("\\.", ",", df$a) 

Bạn cũng có thể thay đổi đầu ra từ in R, vẽ và hành động của hàm as.character. Bạn thay đổi nó từ mặc định của nó với:

options(OutDec= ",")

Và tùy chọn khác là sử dụng format chức năng.

format(df, decimal.mark=",") 

Tôi cho rằng bạn quan tâm đến cách thức con số được in (đầu ra), vì trong nội bộ số được lưu giữ như một số dấu chấm động có độ chính xác gấp đôi (Cập nhật nhờ bình luận bằng @digemall). Ngoài ra, trừ khi đối với một số chức năng như read.table, nó được xác định cụ thể rằng dấu phân cách thập phân là ,, không thể thực hiện được cách khác, bởi vì theo mặc định , được sử dụng để tách đối số hàm.

NA được giới thiệu chính xác vì lý do đó (ngoài regex không chính xác).

df$a <- as.numeric(gsub("\\.", ",", df$a)) 

Theo trình phân tích cú pháp mặc định không biết rằng , được sử dụng làm dấu tách thập phân.

+1

Có vẻ như phần 'tùy chọn' chắc chắn là những gì OP cần. –

+0

Điều này chuyển đổi "." đến ",". Tốt! Vấn đề là những gì tôi thực sự cố gắng đạt được là xuất một tập hợp lớn các tọa độ địa lý. Chương trình xử lý các tọa độ không nhận ra chúng như vậy nếu chúng ở định dạng ký tự. Tôi sẽ kiểm tra sau liệu chương trình có chấp nhận giải pháp này hay không. –

+0

Nếu bạn đang xuất dữ liệu với thứ gì đó như 'write.csv' thì bạn phải sử dụng nó với tham số * dec * bổ sung như sau:' write.csv (dữ liệu, tệp = tệp, dec = ",") ' –

2

Nếu bạn chỉ muốn dấu phẩy để in, bạn có thể sử dụng định dạng:

data <- data.frame(a=rnorm(5), b=rnorm(5)) 
format(data, decimal.mark=",") 
       a   b 
1 1,058878354 0,1812629 
2 1,026163906 -0,6666500 
3 1,538423889 -1,4206752 
4 -0,561585916 -0,4729558 
5 -0,004685406 1,0744514 

Tuy nhiên điều này sẽ chỉ thay đổi cách họ nhìn. Bạn sẽ vẫn phải sử dụng dấu chấm trong gán.

+1

Nếu bạn muốn đặt vĩnh viễn đầu ra trông như thế này, [xem câu trả lời này] (http://stackoverflow.com/questions/16384836/how-to-set-as-decimal-separator-with-r-rstudio). Bạn có thể sử dụng 'tùy chọn (OutDec =", ")'. – nograpes

+0

Nhưng điều này chuyển đổi những số thành ký tự, phải không? Tôi sẽ cần các giá trị để được số và với "," –

+1

Đây là điều: các cửa hàng máy tính làm con số theo những cách rất khác nhau hơn bạn dường như họ. Với điều này bạn có thể thay đổi cách R trình bày các số cho bạn. Chúng sẽ là số, nhưng khi in trên màn hình, chúng sẽ có dấu phẩy thay vì dấu chấm. Đối với đầu vào, tôi nghi ngờ rằng bạn không thể thay đổi dấu chấm thành dấu phẩy. Hãy xem xét điều này 'c (1,2,3,4)'. Bây giờ làm thế nào thông dịch viên sẽ biết nếu nó là 1 2 3 và 4 hoặc 1,2 và 3,4? –

1

Bạn đang sử dụng OSX hoặc Windows hoặc ...?

Để thay đổi biểu diễn, bạn muốn xem thông số LC_NUMERIC, mặc dù tài liệu R cảnh báo rằng việc thay đổi điều này có thể khiến R hoạt động lạ (khó sử dụng , làm số thập phân khi nó được sử dụng để xác định danh sách ...)

> Sys.getlocale("LC_NUMERIC") 
[1] "C" 
> a=c(1.01,2.01) 
> a 
[1] 1.01 2.01 
> Sys.setlocale("LC_NUMERIC", "de_DE") # this is OSX syntax 
> a 
[1] 1,01 2,01 

Có thể an toàn hơn chỉ để sống với nó!

Các vấn đề liên quan