2015-11-29 25 views
5

Tôi có một khung dữ liệu lưu trữ các giá trị khác nhau. Mẫu:Tính trung bình của hai cột trong một khung dữ liệu

a$open a$high a$low a$close 

1.08648 1.08707 1.08476 1.08551 
1.08552 1.08623 1.08426 1.08542 
1.08542 1.08572 1.08453 1.08465 
1.08468 1.08566 1.08402 1.08554 
1.08552 1.08565 1.08436 1.08464 
1.08463 1.08543 1.08452 1.08475 
1.08475 1.08504 1.08427 1.08436 
1.08433 1.08438 1.08275 1.08285 
1.08275 1.08353 1.08275 1.08325 
1.08325 1.08431 1.08315 1.08378 
1.08379 1.08383 1.08275 1.08294 
1.08292 1.08338 1.08271 1.08325 

Những gì tôi muốn làm, đang tạo ra một cột mới a$mean lưu trữ giá trị trung bình của a$higha$low cho mỗi hàng.

Dưới đây là làm thế nào tôi đạt được rằng:

highlowmean <- function(highs, lows){ 
    m <- vector(mode="numeric", length=0) 
    for (i in 1:length(highs)){ 
    m[i] <- mean(highs[i], lows[i]) 
    } 
    return(m) 
} 

a$mean <- highlowmean(a$high, a$low) 

Tuy nhiên tôi là một chút mới vào R và bằng các ngôn ngữ functionnal nói chung, vì vậy tôi khá chắc chắn rằng có một/cách đơn giản hiệu quả hơn để đạt được điều đó.

Làm cách nào để đạt được điều đó một cách thông minh nhất?

Trả lời

5

Đối với giá trị trung bình của hai số bạn không thực sự cần bất kỳ chức năng đặc biệt:

a$mean = (a$high + a$low)/2 

Đối với một trường hợp dễ dàng như vậy, điều này tránh được bất kỳ chuyển đổi để sử dụng matrixapply hoặc rowMeans.

11

Chúng ta có thể sử dụng rowMeans

a$mean <- rowMeans(a[c('high', 'low')], na.rm=TRUE) 

Chú ý: Nếu có NA giá trị, nó là tốt hơn để sử dụng rowMeans

Ví dụ

a <- data.frame(High= c(NA, 3, 2), low= c(3, NA, 0)) 
rowMeans(a, na.rm=TRUE)  
#[1] 3 3 1 

và sử dụng +

a1 <- replace(a, is.na(a), 0) 
(a1[1] + a1[2])/2 
# High 
#1 1.5 
#2 1.5 
#3 1.0 

LƯU Ý: Đây không phải là cách cố gắng làm hoen ố câu trả lời khác. Nó hoạt động trong hầu hết các trường hợp và cũng nhanh.

+0

Hành vi sẽ không sử dụng rowMeans là gì? NA sẽ được lấy là 0? – Lovy

+3

@LoveMetal Chỉ cần kiểm tra này 'có nghĩa là (c (3, NA), na.rm = TRUE)' và '(3 + 0)/2' – akrun

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