2016-11-19 4 views
0

아이디를 선택하고 특정 조건으로 아이디 평균을 취하고 싶습니다. 나는 특정 요인 예를 들어특정 조건의 아이디를 선택하고이 아이디 값의 평균을 측정하십시오. R

mdf <- data.frame (id =c(1,2,3,2,1,2), 
factor= c("a","b","a","a","b" ,"a") , value = c(4,0,5,2,3,6)) 



    id factor value 
1 1  a  4 
2 2  b  0 
3 3  a  5 
4 2  a  2 
5 1  b  3 
6 2  a  6 

, 나는 요인으로 b했다 식별자의 평균, ID 1과 2는 같은 b 있었다 원하는 적어도 1 시간이 있었다 모든 식별자의 평균을 측정하고 싶습니다 factor는 목록에서 한 번만 쓴다. 따라서 '내 코드는 id 1과 id 2의 값을 추출하고 평균 (4 + 0 + 2 + 3 + 6)/5 = 3을 측정해야한다. id 3에는 b이 없었으므로 계산에서 제외됩니다. 나의 이상적인 출력 변환 후

factor avg 
a  3.33 
b  3 
+0

akrun는 ID 3, 우리가 그들의 요인에 적어도 한 번 B 있었다 ID의 평균을, B가 없었 . 분명하지 않다면 알려주세요. 더 많은 예제를 드리겠습니다. – MFR

+0

예, 평균값을 계산할 때, id 3에는 b가 없었기 때문에 id 1과 id 2로 모든 값의 평균을 취했습니다. id 3. – MFR

+0

맞아요.하지만 여러 가지 요소가 있습니다. 각 요소에 대한 값을 개별적으로 측정 할 수는 없으므로 모든 요소에 대해 자동으로 수행하고 싶습니다. – MFR

답변

2

될 것이다 data.framedata.table (setDT(mdf)), 우리는 'ID'는 '요소'의 ifany 그룹화 '요소'의 unique 요소를 통해 루프 것을 가지고 특정 요소는 data.table (.SD)의 하위 집합이며 'value'의 mean이고 'factor'요소의 unique은 2 열 'data.table'이고 rbindlist 요소입니다. 이 계산에서 제외되도록

library(data.table) 
setDT(mdf) 
rbindlist(lapply(unique(mdf$factor), function(x) { 
     x1 <- mdf[, if(any(factor==x)) .SD, id][, .(factor= x, avg=mean(value))]})) 
# factor  avg 
#1:  a 3.333333 
#2:  b 3.000000 
+0

@akrun, 정말 고마워. 요소가없는 ID의 평균을 원한다면 예를 들어'if (any (factor == x)) '를 쓸 수 있습니까? 예를 들어 b를 가지지 않은 ID를 선택하고 싶다고합시다 그리고 그들 평균을 구하십시오. – MFR

+1

@MFR이 경우, 아마 if (all (factor! = x))' – akrun

2

기본 R을 통해 아이디어,

fun1 <- function(df, f, include = TRUE){ 
    ind <- unique(df$id[df$factor == f]) 
    if (include == TRUE) { 
    return(mean(df$value[df$id %in% ind])) 
    } else { 
    return(mean(df$value[!df$id %in% ind])) 
    } 
} 

sapply(levels(mdf$factor), function(i) fun1(mdf, i)) 
#  a  b 
#3.333333 3.000000 

sapply(levels(mdf$factor), function(i) fun1(mdf, i, include = FALSE)) 
# a b 
#NaN 5 
관련 문제