2015-06-16 26 views
7

Tôi có hai cột số score.ascore.b. Tôi muốn tạo một biến mới score.c chuyển điểm số quan sát được từ a hoặc b, nhưng khi chúng được quan sát thấy ở cả hai, tôi cần lấy mức trung bình.Tạo cột mới dựa trên hai cột khác, nhưng trung bình khi được quan sát trong cả hai

help <- data.frame(deid = c(5, 7, 12, 15, 25, 32, 42, 77, 92, 100, 112, 113), 
       score.a = c(NA, 2, 2, 2, NA, NA, NA, NA, NA, NA, 2, NA), 
       score.b = c(4, NA, NA, 4, 4, 4, NA, NA, 4, 4, NA, 4)) 

tạo

deid score.a score.b 
1  5  NA  4 
2  7  2  NA 
3 12  2  NA 
4 15  2  4 
5 25  NA  4 
6 32  NA  4 
7 42  NA  NA 
8 77  NA  NA 
9 92  NA  4 
10 100  NA  4 
11 112  2  NA 
12 113  NA  4 

Và tôi hy vọng sẽ tạo ra một df trông giống như

 deid score.a score.b score.c 
1  5  NA  4  4 
2  7  2  NA  2 
3 12  2  NA  2 
4 15  2  4  3 
5 25  NA  4  4 
6 32  NA  4  4 
7 42  NA  NA  NA 
8 77  NA  NA  NA 
9 92  NA  4  4 
10 100  NA  4  4 
11 112  2  NA  2 
12 113  NA  4  4 

ví dụ, trong hàng 4 phải mất giá trị trung bình.

Nỗ lực của tôi đã sử dụng help %>% group_by(deid) %>% mutate(score.c = (score.a + score.b)/2) nhưng điều này chỉ xử lý dữ liệu được quan sát thấy trong cả hai cột.

Trả lời

6

Hãy thử

help$score.c <- rowMeans(help[2:3], na.rm=TRUE) 

Hoặc một cách tiếp cận có thể với dplyr (không kiểm tra kỹ lưỡng)

library(dplyr) 
help %>% 
    mutate(val= (pmax(score.a, score.b, na.rm=TRUE)+ 
        pmin(score.a, score.b, na.rm=TRUE))/2) 
+0

mắc kẹt trên dplyr và quên mất rowMeans ... cảm ơn, @akrun! – bpace

+0

@bpace Nếu bạn cần làm trong 'dplyr'. Thử 'help%>% mutate (val = (pmax (điểm.a, score.b, na.rm = TRUE) + pmin (điểm.a, score.b, na.rm = TRUE))/2)' – akrun

+0

tốt để biết, cảm ơn ... không quen thuộc với pmax() và pmin() vì vậy tôi sẽ kiểm tra xem chúng ra – bpace

3

Một giải pháp data.table sẽ là:

library(data.table) 
setDT(help) 
help[,.(rMean=rowMeans(.SD,na.rm = T)),.SDcols = c('score.a','score.b')] 
+0

'giúp đỡ <- setDT (trợ giúp)' cho là gì? 'setDT (help)' sửa đổi dữ liệu * tại chỗ *. –

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