2014-10-14 1 views
2

새로운 열로 결과를 추가하는 방법 :골재 계산하고 다음 데이터 주어 R

data 
    a b c 
1 x m 1 
2 x n 2 
3 x m 3 
4 y n 4 
5 y m 5 
6 y n 6 

는 I가 그룹화 C의 집합체 분을 계산하려면, B :

setNames(aggregate(data$c, by=list(data$a, data$b), min), c("a", "b", "min_c")) 

    a b min_c 
1 x m  1 
2 y m  5 
3 x n  2 
4 y n  4 

그러나 나는 다음과 같은 원래의 데이터에 "min_c"를 추가하려면 :

a b c min_c 
1 x m 1 1 
2 x n 2 2 
3 x m 3 1 
4 y n 4 4 
5 y m 5 5 
6 y n 6 4 

R에서 할 수있는 간단한 방법은 무엇입니까?

답변

2

자료 R 접근

transform(data, minc = ave(c, list(a, b), FUN = min)) 
# a b c minc 
# 1 x m 1 1 
# 2 x n 2 2 
# 3 x m 3 1 
# 4 y n 4 4 
# 5 y m 5 5 
# 6 y n 6 4 
4

dplyr와 접근 방법은 다음과 같습니다

library(dplyr) 

mydf %>% 
    group_by(a,b) %>% 
    mutate(cmin = min(c)) 

# a b c cmin 
#1 x m 1 1 
#2 x n 2 2 
#3 x m 3 1 
#4 y n 4 4 
#5 y m 5 5 
#6 y n 6 4 
3

data.table 접근

데이터

library(data.table) 
dt = data.table(a = rep(c("x", "y"), each=3), 
       b = rep(c("m","n"), 3), 
       c = 1:6) 

계산 및 추가

dt[, cmin := min(c), by = "a,b"][] 
# a b c cmin 
# 1: x m 1 1 
# 2: x n 2 2 
# 3: x m 3 1 
# 4: y n 4 4 
# 5: y m 5 5 
# 6: y n 6 4 

:=[]는 원래의 데이터가 데이터 프레임 인 경우 다음과 같은 결과를

을 인쇄하는 것입니다, 할당하는 의미

df = data.frame(a = rep(c("x", "y"), each=3), 
       b = rep(c("m","n"), 3), 
       c = 1:6) 

당신은 데이터 테이블로 변환 setDT를 사용할 수 있습니다.

setDT(df) 
+0

그의 데이터 세트는 처음에는'data.table'이 아니므로'data.table' 클래스에 이미 있다고 가정하지 않고'setDT' 또는'as.data.table'을 사용해야합니다 –

+1

@DavidArenburg, 수정. 데이터 테이블은 data.table 함수를 사용하여 생성 되었기 때문에. 우리는 setDT를 사용하여 저장할 수 있습니다. 이를 반영하기 위해 몇 줄을 추가 할 것입니다. – KFB

2
> zz <- " a b c 
+ 1 x m 1 
+ 2 x n 2 
+ 3 x m 3 
+ 4 y n 4 
+ 5 y m 5 
+ 6 y n 6" 
> 
> Data <- read.table(text=zz, header = TRUE) 
> dt <- as.data.table(Data) 
> 
> dt[, min_c := min(c), by = list(a,b)] 
> dt 
    a b c min_c 
1: x m 1  1 
2: x n 2  2 
3: x m 3  1 
4: y n 4  4 
5: y m 5  5 
6: y n 6  4 
0

은 다음보십시오 :

merge(data,data2) 

전체 출력 :

> data 
    a b c 
1 x m 1 
2 x n 2 
3 x m 3 
4 y n 4 
5 y m 5 
6 y n 6 
> 
> data2 = setNames(aggregate(data$c, by=list(data$a, data$b), min), c("a", "b", "min_c")) 
> data2 
    a b min_c 
1 x m  1 
2 y m  5 
3 x n  2 
4 y n  4 
> 
> merge(data,data2) 
    a b c min_c 
1 x m 1  1 
2 x m 3  1 
3 x n 2  2 
4 y m 5  5 
5 y n 4  4 
6 y n 6  4 
1
ddply(Data, .(a, b), transform, 
+  min_c=min(c)) 
    a b c min_c 
1 x m 1  1 
2 x m 3  1 
3 x n 2  2 
4 y m 5  5 
5 y n 4  4 
6 y n 6  4 
관련 문제