2011-10-30 40 views
5

Tôi đang nhập tệp CSV 3 cột. Cột cuối cùng là một chuỗi các mục nhập hoặc là số nguyên hoặc một chuỗi trong dấu ngoặc kép.Đọc tệp csv, có số và chuỗi trong một cột

Dưới đây là một loạt các mục Ví dụ:

1,4,"m" 
1,5,20 
1,6,"Canada" 
1,7,4 
1,8,5 

Khi tôi nhập khẩu này bằng read.csv, đây là những bài mới bước sang tuổi trong các yếu tố.

Làm cách nào tôi có thể thiết lập sao cho chúng được đọc dưới dạng số nguyên và chuỗi?

Cảm ơn bạn!

Trả lời

8

Điều này là không thể, vì một véc tơ cụ thể chỉ có thể có một chế độ đơn lẻ (ví dụ: character, numeric hoặc logical).

Tuy nhiên, bạn có thể chia vector vào hai vectơ riêng biệt, một với giá trị số và thứ hai với giá trị nhân vật:

vec <- c("m", 20, "Canada", 4, 5) 

vnum <- as.numeric(vec) 
vchar <- ifelse(is.na(vnum), vec, NA) 

vnum 
[1] NA 20 NA 4 5 

vchar 
[1] "m"  NA  "Canada" NA  NA  
+0

Andrie bạn nói điều tương tự như tôi nhưng tốt hơn. –

+0

@ user718281, để đọc dưới dạng chuỗi, không phải là các yếu tố, sử dụng read.csv (..., stringsAsFactors = FALSE) – Max

+0

Cảm ơn Andrie. Một điều tôi không hoàn toàn chắc chắn làm thế nào để làm mặc dù, là làm thế nào để tôi đi từ các tập tin csv để vector. Như trong, nó là sự hiểu biết của tôi rằng read.csv kết quả đầu ra một ma trận, không phải là một vector. – evt

2

số Một dataframe là một loạt các vectơ dán với nhau (một danh sách các vectơ hoặc ma trận). Bởi vì mỗi cột là một vec-tơ, nó không thể được phân loại là cả số nguyên và hệ số. Nó phải là một hoặc khác. Bạn có thể chia vector ra thành số và hệ số (acolumn cho mỗi số) nhưng tôi không tin đây là thứ bạn muốn.

6

EDITMặc dù quyết định của OP chấp nhận câu trả lời này, @ Câu trả lời của Andrie là giải pháp ưu tiên. Câu trả lời của tôi có nghĩa là chỉ để thông báo về một số tính năng lẻ của khung dữ liệu.

Như những người khác đã chỉ ra, câu trả lời ngắn gọn là điều này là không thể. data.frame s được dự định chứa các cột của một loại nguyên tử duy nhất. @ Đề nghị của Andrie là một gợi ý tốt, nhưng chỉ cho các cú đá tôi nghĩ tôi muốn chỉ ra một cách để đánh thức loại dữ liệu này thành một data.frame.

Bạn có thể chuyển đổi các cột vi phạm vào một danh sách (mã này giả định bạn đã thiết options(stringsAsFactors = FALSE)):

dat <- read.table(textConnection("1,4,'m' 
1,5,20 
1,6,'Canada' 
1,7,4 
1,8,5"),header = FALSE,sep = ",") 

tmp <- as.list(as.numeric(dat$V3)) 
tmp[c(1,3)] <- dat$V3[c(1,3)] 
dat$V3 <- tmp 

str(dat) 
'data.frame': 5 obs. of 3 variables: 
$ V1: int 1 1 1 1 1 
$ V2: int 4 5 6 7 8 
$ V3:List of 5 
    ..$ : chr "m" 
    ..$ : num 20 
    ..$ : chr "Canada" 
    ..$ : num 4 
    ..$ : num 5 

Giờ đây, có tất cả các loại lý do tại sao đây là một ý tưởng tồi. Đối với một, rất nhiều mã mà bạn mong đợi để chơi độc đáo với data.frame s sẽ không thích điều này và hoặc là không, hoặc cư xử rất kỳ lạ. Nhưng tôi nghĩ tôi chỉ ra nó như một sự tò mò.

+0

+1 Chỉ vì đây là một ý tưởng tồi! – Andrie

+0

Như một sự tàn bạo như thế này, tôi đang tranh luận về đạo đức của việc sắp tới với cái gì đó tệ hơn. :) – Iterator

+0

Hmm, thực ra, điều này không thể tái sản xuất được cho tôi. Các giá trị của V3 là 5,1,4,2,3, và các lớp là int, num, int, num, num. Độ phân giải: 'options (stringsAsFactors = FALSE)'. – Iterator

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