2009-10-25 38 views
5

Tôi đang sử dụng gói R's stats và muốn lặp qua column[x] trong all the rows of a dataframe, hoạt động trên các dữ liệu trong each cell trong cột với một chức năng và thông qua kết quả vào một cột mới (với calculated result trong các new column phù hợp với các dữ liệu trong column[x])Looping thông qua một cột trong R

tôi đã có hai vấn đề:

  1. tôi không thể làm cho nó hoạt
  2. looping dường như nản chí trong R articles Tôi đã đọc. Có một cách tiếp cận thay thế và nếu không, không ai có một ví dụ về làm thế nào để thực hiện vòng lặp?
+0

Bạn có thể cung cấp thêm chi tiết cho chúng tôi không? Giống như một vấn đề ví dụ bạn đang làm việc với? – ariddell

+2

Looping không nhất thiết phải được khuyến khích. Làm cho nó hoạt động đầu tiên, và chỉ sau đó suy nghĩ về việc nếu nhanh hơn. –

Trả lời

8

Không có ví dụ nào, thật khó để biết cách trả lời. Trường hợp cơ bản về những gì bạn đang mô tả, tuy nhiên, là thế này:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

Khi bạn nói với R vuông một vector (hoặc cấu trúc vector giống như, giống như dat $ x), nó biết vuông mỗi giá trị riêng . Bạn không cần phải rõ ràng lặp lại các giá trị đó hầu hết thời gian - mặc dù, như Dirk lưu ý, bạn chỉ nên lo lắng về việc tối ưu hóa các vòng lặp của bạn nếu chúng gây ra vấn đề cho bạn. Điều đó nói rằng, tôi chắc chắn thích đọc và viết

dat$y <- dat$x^2 

tới:

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

... nếu có thể.

+0

Cảm ơn. Tôi có thể nhận được số học làm việc OK. Tôi không thể chuyển nội dung của một khung dữ liệu đến một hàm. Đây là vấn đề. Đây là phần đầu của khung (được gọi là dữ liệu) với tiêu đề "hợp chất" và "SMILES" (nụ cười là một đại diện văn bản của một phân tử) Hợp chất_ID SMILES 12345 c1cccccc1 Tôi muốn sử dụng hàm parse.smiles() để đọc trong nụ cười và xuất một phân tử. Nếu tôi làm điều đó trên một phân tử của nó OK (rác <- "c1ccccc1", phân tích cú pháp.những nụ cười (rác) Nếu tôi làm sp <- get.smiles.parser() rác <- sapply (dữ liệu $ nụ cười, parse.smiles, phân tích cú pháp = sp) nó không thể giải thích những nụ cười – Andy

+0

Được rồi. Xin lỗi, không hoàn toàn chắc chắn nơi bạn đang ở trong R, vì vậy tôi nghĩ rằng tôi sẽ chỉ ném trường hợp cơ bản ra khỏi đó. "không rõ" có thể có nó - nhưng nếu không, đặt cược tốt nhất của bạn là đăng một tập dữ liệu mẫu nhỏ và chức năng. Rất khó để hiểu được những gì đang diễn ra sai lệch từ một mô tả, và tôi, ít nhất, không thể nhận được bất kỳ * chức năng áp dụng nào mà không cần thử nghiệm. –

1

nếu parse.smiles() là một hàm bạn muốn áp dụng cho tất cả các sự xâm nhập của một vector "vec", sau đó bạn có thể sử dụng:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

Cảm ơn mọi người. Cột tôi quan tâm đã được đọc như một yếu tố. Tôi phải nói một cách rõ ràng chức năng để đọc trong nội dung như các nhân vật và tôi đã không nhận ra điều này cho đến khi chỉ ra. Nó hiện đang hoạt động. (và xin lỗi vì đã nhận xét bị cắt xén ở trên - Đã được định dạng với các lần trả lại biến mất khi được đăng) – Andy

1

Lý do duy nhất vòng lặp không được khuyến khích là nó là chậm. R được thiết kế để làm việc trên vectơ tại một thời điểm và có rất nhiều chức năng để thực hiện điều này. Toàn bộ áp dụng gia đình, cũng như các chức năng như Vectorize để giúp đỡ. Vì vậy, thành ngữ là nếu bạn sử dụng cho các vòng bạn không suy nghĩ trong R, nhưng đôi khi cho các vòng thực sự chỉ thích hợp.

Để thực hiện điều này theo cách suy nghĩ R, Vector hóa chức năng của bạn, nếu nó chưa được vector hóa (xem hàm Vectorize), hãy gọi hàm đó với toàn bộ cột làm đối số và gán cho cột mới.

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

Gia đình áp dụng (áp dụng, thường xuyên, lapply, mapply, tapply) cũng là lựa chọn thay thế. Hầu hết các hàm R gốc đều đã được vector hóa, nhưng hãy cẩn thận khi truyền các đối số thừa được cho là được hiểu là các vectơ.

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