2015-03-30 34 views
6

Tôi có một dataframe nơi một cột có giá trị nhân bản nhưThực hiện một cột với các giá trị trùng lặp độc đáo trong một dataframe

employee <- data.frame(name = c('John', 'Joe', 'Mat', 'John', 'Joe'), 
      salary = c(1500, 2000, 1700, 1210, 2100), 
      startdate = c('2012-05-10', '2015-02-17', 
      '2014-09-11', '2011-11-23', '2010-10-27')) 

tôi có thể nhận các yếu tố duy nhất trong cột 1 của

unique(employee$name) 

Tuy nhiên, Tôi muốn tạo từng mục trong cột name duy nhất. Nếu một cái gì đó xuất hiện lần thứ hai nối thêm _1 với nó. Nếu nó xuất hiện một lần nữa nối thêm _2 vào nó. Vì vậy, trong khung dữ liệu của nhân viên, tôi muốn thay đổi cột thứ hai thành

John 
Joe 
Mat 
John_1 
Joe_1 

Có cách nào trừ vòng lặp không?

Trả lời

7

Chúng tôi có thể sử dụng make.names với unique=TRUE. Theo mặc định, một . sẽ được nối trước khi những con số hậu tố, và có thể được thay thế bằng _ sử dụng sub

employee$name <- sub('[.]', '_', make.names(employee$name, unique=TRUE)) 

Hoặc một lựa chọn tốt hơn được đề xuất bởi @DavidArenburg. Nếu cột namefactor lớp, chuyển đổi các cột đầu vào character lớp (as.character) trước khi áp dụng make.unique

make.unique(as.character(employee$name), sep = "_") 
#[1] "John" "Joe" "Mat" "John_1" "Joe_1" 
+0

@DavidArenburg Đó là đẹp hơn nhiều. Bạn có thể xem xét việc đăng bài đó dưới dạng câu trả lời riêng biệt. Vì cột là yếu tố, 'make.unique (as.character (tên nhân viên $), sep =" _ ")' – akrun

+0

@DavidArenburg Cảm ơn, sau đó tôi sẽ đưa nó vào bài đăng – akrun

+0

Btw, có thể OP có một ký tự vectơ, anh ta đã mắc lỗi trong khi tạo ra ví dụ tái sản xuất của mình. –

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