2014-09-01 5 views
1

나는 다음 한 데이터 프레임 : 다음 나는 평균과 SD 열 (평균 및 각 행에 대해 SD) 추가 할추가 열

> ddf 
    aa bb cc dd 
1 1 2 3 4 
2 5 6 7 8 
3 9 10 11 12 
> 
> 
> dput(ddf) 
structure(list(aa = c(1L, 5L, 9L), bb = c(2L, 6L, 10L), cc = c(3L, 
7L, 11L), dd = c(4L, 8L, 12L)), .Names = c("aa", "bb", "cc", 
"dd"), class = "data.frame", row.names = c(NA, -3L)) 
> 

하지만 작동하지 않습니다

ddf$mean = mean(ddf[,1:4]) 
Warning message: 
In mean.default(ddf[, 1:4]) : 
    argument is not numeric or logical: returning NA 
> ddf$sd = sd(ddf[,1:4]) 
Error in is.data.frame(x) : 
    (list) object cannot be coerced to type 'double' 
> 
> ddf 
    aa bb cc dd mean 
1 1 2 3 4 NA 
2 5 6 7 8 NA 
3 9 10 11 12 NA 

평균 및 sd (각 행에 대한) 열을 어떻게 추가합니까? 당신의 도움을 주셔서 감사합니다.

답변

4

에 대한 Jazzuro의 답변을 볼 수 있습니다. 그렇게하면 필요할 경우 나중에 추가 할 수 있으므로 na.rm = TRUE 번을 여러 번 쓸 필요가 없습니다. 다만`sd` 할 것 -

foo <- function(x, digits = 3L, ...) { 
    x <- c(x, recursive = TRUE, use.names = FALSE) 
    res <- c(mean = mean(x, ...), sd = sd(x, ...), 
      median = median(x, ...), max = max(x, ...)) 
    round(res, digits) 
} 
cbind(ddf, t(apply(ddf, 1, foo, na.rm = TRUE))) 
# aa bb cc dd mean sd median max 
# 1 1 2 3 4 2.5 1.291 2.5 4 
# 2 5 6 7 8 6.5 1.291 6.5 8 
# 3 9 10 11 12 10.5 1.291 10.5 12 
2

각 열에 의미를 나타내려면 rowMeans()를 사용할 수 있습니다. SD의 경우 apply()를 사용했습니다.

ddf$Rmean <- rowMeans(ddf) 
ddf$SD <- apply(ddf[1:4], 1, sd) 

# aa bb cc dd Rmean  SD 
#1 1 2 3 4 2.5 1.290994 
#2 5 6 7 8 6.5 1.290994 
#3 9 10 11 12 10.5 1.290994 
+0

필요가 없습니다 matrixStats를 사용할 수 있습니다. – thelatemail

+0

감사합니다. 나는 그것을 편집 할 것이다. – jazzurro

+0

@ 리차드 처음에는'apply (ddf, 1, sd)'라고 썼습니다. 그러나 나는 SD 값이 옳지 않다는 것을 깨달았다. 내 대답에서 두 줄을 실행하면 SD는 1.118034입니다. 그래서'ddf '를 def [1 : 4]로 변경했습니다. – jazzurro

1
rowmeansmean<- rowMeans(ddf, na.rm = TRUE) #will get you your row means. 

ddfwithmean<- cbind(ddf, rowmeansmean) # adds means to existing dataframe 

당신은 다음 SD와 동일한 기능을 수행 할 필요가,이 apply() 함께 할뿐만 아니라 나는이에 대한 함수를 작성합니다 자세한

2

이미 (x)는``기능 (x)는 SD에 대한 rowMedians, rowSds, rowMaxs

library(matrixStats) 

m1 <- as.matrix(ddf) 
cbind(ddf, 
     mean=rowMeans(m1),sd=rowSds(m1), median=rowMedians(m1), max=rowMaxs(m1)) 
# aa bb cc dd mean  sd median max 
#1 1 2 3 4 2.5 1.290994 2.5 4 
#2 5 6 7 8 6.5 1.290994 6.5 8 
#3 9 10 11 12 10.5 1.290994 10.5 12