2013-08-29 39 views
50

Tôi muốn sử dụng hàm áp dụng trên một khung dữ liệu, nhưng chỉ áp dụng hàm cho 5 cột cuối cùng.R Áp dụng() trên các cột dữ liệu cụ thể

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)}) 

này áp dụng từ A đến tất cả các cột của y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)}) 

này áp dụng A chỉ để cột 4-9 của y, nhưng tổng lợi nhuận của B dải tắt 3 cột đầu tiên ... Tôi vẫn muốn những người đó, tôi chỉ không muốn A áp dụng cho họ.

wifi[,1:3]+B 

cũng không làm những gì tôi mong đợi/muốn.

+1

Các 'bằng' cuộc gọi được làm phức tạp thêm vấn đề này. Nếu nó có liên quan bạn nên viết lại câu hỏi để làm rõ (wifi $ Room là gì?). Tôi đã bỏ qua trong câu trả lời của tôi dưới đây. – leif

+0

Bạn có thể 'cbind (y [1: 3], ...)' cho kết quả bạn đang nhận được. –

Trả lời

42

Sử dụng một ví dụ data.frame và ví dụ chức năng (chỉ cần 1 cho tất cả các giá trị)

A <- function(x) x + 1 
wifi <- data.frame(replicate(9,1:4)) 
wifi 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 1 1 1 1 1 1 
#2 2 2 2 2 2 2 2 2 2 
#3 3 3 3 3 3 3 3 3 3 
#4 4 4 4 4 4 4 4 4 4 

data.frame(wifi[1:3], apply(wifi[4:9],2, A)) 
#or 
cbind(wifi[1:3], apply(wifi[4:9],2, A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 

Hoặc thậm chí:

data.frame(wifi[1:3], lapply(wifi[4:9], A)) 
#or 
cbind(wifi[1:3], lapply(wifi[4:9], A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 
+0

Có cách nào để làm điều này bằng cách sử dụng '$' để chỉ mục một cột nhất định theo tên thay vì sử dụng '[:]' để lập chỉ mục theo số cột không? Tôi đã thử thêm các tên màu: 'colnames (wifi) = c (" a "," b "," c "," d "," e "," f "," g "," h "," i ")' nhưng bất kỳ nỗ lực sử dụng lapply (wifi $ e, 2, X) đã không xảy ra. – skotturi

+5

@skotturi - bạn có thể làm điều này như 'wifi [c (" a "," b "," c ")]' để lập chỉ mục nhiều cột theo tên. – thelatemail

47

lapply có lẽ là một sự lựa chọn tốt hơn so với apply đây, như áp dụng đầu tiên ép buộc data.frame của bạn thành một mảng có nghĩa là tất cả các cột phải có cùng loại. Tùy thuộc vào ngữ cảnh của bạn, điều này có thể có hậu quả không mong muốn.

Các mô hình là:

df[cols] <- lapply(df[cols], FUN) 

Các vector 'cols' có thể là tên biến hoặc chỉ số. Tôi thích sử dụng tên bất cứ khi nào có thể (nó mạnh mẽ để sắp xếp lại cột). Vì vậy, trong trường hợp của bạn này có thể là:

wifi[4:9] <- lapply(wifi[4:9], A) 

Một ví dụ của việc sử dụng tên cột:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9) 
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x) 
+2

Sửa đổi nhỏ: wifi <- data.frame (A = 1: 4, B = runif (4), C = 5: 8) – jcfaria

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