2011-10-13 35 views
8

Tôi có một khung dữ liệu lớn với thông tin phân loại. Dưới đây là ví dụ:áp dụng strsplit vào cột cụ thể trong một data.frame

> d <- data.frame(x = c(1,2,3,4), classification = c("cl1.scl1", "cl2", "cl3-bla", "cl4.subclass2")) 
> d 
    x classification 
1 1  cl1.scl1 
2 2   cl2 
3 3  cl3-bla 
4 4 cl4.subclass2 

Trước khi tôi xử lý thêm, tôi phải chia chuỗi phân loại theo "." và lấy mã thông báo đầu tiên. Đây là kết quả tôi cần:

> d 
    x classification 
1 1   cl1 
2 2   cl2 
3 3  cl3-bla 
4 4   cl4 

Hiện nay tôi đang tính toán này như sau:

d$classification = unlist(lapply(d$classification, function (x) strsplit(as.character(x), ".", fixed=TRUE)[[1]][1])) 

này hoạt động, nhưng nó đã cho tôi nhiều thời gian để con số này ra. Tôi cho rằng có một giải pháp thanh lịch hơn, mà tôi có thể bỏ qua. Bất kỳ đề xuất? Cảm ơn!

+1

Tiêu đề chủ đề của bạn hơi gây hiểu nhầm; điều này không thực sự về việc áp dụng một hàm cho một cột cụ thể, nhưng làm thế nào để thao tác các kết quả từ strsplit. –

Trả lời

3

Bạn có thể sử dụng biểu thức thông thường với back-tài liệu tham khảo.

Có 2 tham chiếu (các phần của cụm từ thông dụng trong dấu ngoặc đơn), được phân cách bằng dấu chấm. Chúng tôi thay thế bất cứ điều gì phù hợp với mô hình đó với nội dung của tham chiếu đầu tiên.

+0

Cảm ơn vì điều đó, giải pháp tuyệt vời! Không biết rằng tôi chỉ có thể áp dụng regex trên khung dữ liệu. – behas

+1

Về mặt kỹ thuật, bạn đang áp dụng cụm từ thông dụng cho một vectơ ký tự ('d $ phân loại' không phải là một data.frame). –

11

Một giải pháp hơi ngắn hơn là

sapply(strsplit(as.character(d$class), "\\."), `[`, 1) 
2

Chỉ cần xóa nội dung theo sau "."

> sub("\\..+$", "", d$class) 
[1] "cl1"  "cl2"  "cl3-bla" "cl4" 

d$classification <- sub("\\..+$", "", d$classification) 
# I've never been very comfortable with partial name matching. 
Các vấn đề liên quan