반응형

출처: https://stat.ethz.ch/pipermail/r-help/2007-February/125860.html



> iris[sample(nrow(iris), 2), ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
96          5.7         3.0          4.2         1.2 versicolor
17          5.4         3.9          1.3         0.4     setosa



# Select 5 random rows

> iris[sample(nrow(iris), 5), ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
83          5.8         2.7          3.9         1.2 versicolor
12          4.8         3.4          1.6         0.2     setosa
63          6.0         2.2          4.0         1.0 versicolor
80          5.7         2.6          3.5         1.0 versicolor
49          5.3         3.7          1.5         0.2     setosa





반응형
반응형

출처: https://stat.ethz.ch/pipermail/r-help/2005-August/077420.html



s1 <- "R-"
s2 <- "project"
paste(s1, s2, sep = "")




반응형
반응형

1. apply - 적용한 함수 값을 리스트로 반환 

 

> (성적 <- read.table("성적.txt", header=TRUE)[-1])  # 성적.txt 파일에서 첫 열을 제거.
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5

 

> apply(성적, 1, sum)  # 행 단위의 계산(합계) 값을 벡터로 출력한다.
 [1] 17 18 22 16 22 20 21 29 16 19
> apply(성적, 1, mean) # 행 단위의 계산(평균) 값을 벡터로 출력한다.
 [1] 5.666667 6.000000 7.333333 5.333333 7.333333 6.666667 7.000000 9.666667 5.333333 6.333333
> round(apply(성적, 1, mean),1) # round() 함수로 소수점 1자리까지 반올림.
 [1] 5.7 6.0 7.3 5.3 7.3 6.7 7.0 9.7 5.3 6.3
> apply(성적, 2, sum)  # 열 단위의 계산(합계) 값을 벡터로 출력한다.
국어 수학 영어 
  65   67   68 
> apply(성적, 2, mean) # 열 단위의 계산(평균) 값을 벡터로 출력한다.
국어 수학 영어 
 6.5  6.7  6.8 

 


요약 함수가 아닌 각각의 요소 값에 적용되는 함수의 예제

 

> apply(성적, 1, function(x){x*2})
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
국어   16   12   18    8   10   10    8   20   14    14
수학   14   10    8   10   16   18   14   20   10    14
영어    4   14   18   14   18   12   20   18    8    10



> apply(성적, 2, function(x){x*2})
      국어 수학 영어
 [1,]   16   14    4
 [2,]   12   10   14
 [3,]   18    8   18
 [4,]    8   10   14
 [5,]   10   16   18
 [6,]   10   18   12
 [7,]    8   14   20
 [8,]   20   20   18
 [9,]   14   10    8
[10,]   14   14   10



> 성적 * 2
   국어 수학 영어
1    16   14    4
2    12   10   14
3    18    8   18
4     8   10   14
5    10   16   18
6    10   18   12
7     8   14   20
8    20   20   18
9    14   10    8
10   14   14   10


​> 성적 * function(x){x*2}
Error in FUN(left, right) : non-numeric argument to binary operator


위와 같이 상수가 아닌 경우 직접적인 계산 함수를 적용할 수 없기 때문에 apply() 함수를 사용한다.



2. lapply(list apply) - 적용한 함수 값을 리스트로 반환 

> 성적 <- read.table("성적.txt", header=TRUE) # 성적.txt 파일을 읽어서 성적이라는 변수에 저장한다.
> 성적
   학번 국어 수학 영어
1     1    8    7    2
2     2    6    5    7
3     3    9    4    9
4     4    4    5    7
5     5    5    8    9
6     6    5    9    6
7     7    4    7   10
8     8   10   10    9
9     9    7    5    4
10   10    7    7    5

> 성적 <- 성적[-1] # 성적데이터에서 학번열을 제거한다.
> 성적
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5

> lapply(성적, sum) $국어 [1] 65 $수학 [1] 67 $영어 [1] 68

> lapply(성적, mean) $국어 [1] 6.5 $수학 [1] 6.7 $영어 [1] 6.8 

 

 

 

3. sapply(simple apply) - 적용한 함수 값을 벡터나 행렬로 반환

 

> 성적 <- read.table("성적.txt", header=TRUE) # 성적.txt 파일을 읽어서 성적이라는 변수에 저장한다.
> 성적
   학번 국어 수학 영어
1     1    8    7    2
2     2    6    5    7
3     3    9    4    9
4     4    4    5    7
5     5    5    8    9
6     6    5    9    6
7     7    4    7   10
8     8   10   10    9
9     9    7    5    4
10   10    7    7    5
> 성적 <- 성적[-1] # 성적데이터에서 학번열을 제거한다.
> 성적
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5
> sapply(성적, sum)  # 각각의 열의 합계를 구한다.
국어 수학 영어 
  65   67   68 
> sapply(성적, mean) # 각각의 열의 평균을 구한다.
국어 수학 영어 
 6.5  6.7  6.8 

 

참고로 unlist() 함수를 적용해서 lapply()에 적용하면 sapply() 와 동일한 결과가 된다.

> unlist(lapply(성적, sum))
국어 수학 영어 
  65   67   68

> sapply(성적, sum)  # 각각의 열의 합계를 구한다.
국어 수학 영어 
  65   67   68

 


4. tapply(table apply) - 그룹으로 묶은 후 함수를 적용, 적용 값을 벡터나 행렬로 반환

tapply( data, Index, function .. ) 

 

index : 그룹지을 값을 지정한다.

 

> 환자 <- read.table("환자.txt", header=TRUE)
> 환자
  환자번호     입원일 나이 합병증      증세
1        1 2014-10-15   25  Type1      Poor
2        2 2014-11-01   34  Type2  Improved
3        3 2014-10-21   28  Type1 Excellent
4        4 2014-10-28   52  Type1      Poor
5        5 2014-11-01   37  Type2  Improved
6        6 2014-11-01   40  Type2  Improved

 
> factor(환자$합병증)
[1] Type1 Type2 Type1 Type1 Type2 Type2
Levels: Type1 Type2
> tapply(환자$합병증, 환자$합병증, length) # 합병증의 그룹별 환자의 수
Type1 Type2 
    3     3 
> tapply(환자$나이, 환자$합병증, mean)     # 합병증의 그룹별 나이의 평균
Type1 Type2 
   35    37 

 


5. mapply(multi simple apply) - 여러 개의 리스트에 함수를 적용

> m1 <- list(a = c(1:10), b = c(11:20))
> m2 <- list(c = c(21:30), d = c(31:40))

> mapply(sum, m1$a, m2$d) # 2개의 리스트에 적용
 [1] 32 34 36 38 40 42 44 46 48 50


> mapply(sum, m1$a, m1$b, m2$c, m2$d) # 2개의 리스트에 적용
 [1]  64  68  72  76  80  84  88  92  96 100

 

6. by - 특정한 그룹으로 묶어서 함수를 적용

 

> 성적 <- read.table("성적2.txt", header=TRUE)
> 성적 <- 성적[,c(-1,-2)]
> 성적
   국어 수학 영어 반
1     8    7    2  1
2     6    5    7  1
3     9    4    9  1
4     4    5    7  1
5     5    8    9  1
6     5    9    6  1
7     4    7   10  1
8    10   10    9  1
9     7    5    4  1
10    7    7    5  1
11    6    4    9  2
12    6    5    8  2
13    5    5    4  2
14    4    6   10  2
15    5    8    4  2
16    9    7    8  2
17   10   10    4  2
18    6    8    6  2
19    5    6    5  2
20    8    8    9  2



> by(성적[, 1:3], 성적$반, colMeans)
성적$반: 1
국어 수학 영어
 6.5  6.7  6.8
------------------------------------------------------------------------------
성적$반: 2
국어 수학 영어
 6.4  6.7  6.7



> by(성적[, 1:3], 성적$반, colSums)
성적$반: 1
국어 수학 영어
  65   67   68
------------------------------------------------------------------------------
성적$반: 2
국어 수학 영어
  64   67   67




> by(성적[, 3:5], 성적$반, summary)
성적$반: 1
      국어            수학            영어     
 Min.   : 4.00   Min.   : 4.00   Min.   : 2.00 
 1st Qu.: 5.00   1st Qu.: 5.00   1st Qu.: 5.25 
 Median : 6.50   Median : 7.00   Median : 7.00 
 Mean   : 6.50   Mean   : 6.70   Mean   : 6.80 
 3rd Qu.: 7.75   3rd Qu.: 7.75   3rd Qu.: 9.00 
 Max.   :10.00   Max.   :10.00   Max.   :10.00 
------------------------------------------------------------------------------
성적$반: 2
      국어           수학            영어     
 Min.   : 4.0   Min.   : 4.00   Min.   : 4.00 
 1st Qu.: 5.0   1st Qu.: 5.25   1st Qu.: 4.25 
 Median : 6.0   Median : 6.50   Median : 7.00 
 Mean   : 6.4   Mean   : 6.70   Mean   : 6.70 
 3rd Qu.: 7.5   3rd Qu.: 8.00   3rd Qu.: 8.75 
 Max.   :10.0   Max.   :10.00   Max.   :10.00


성적.txt


성적2.txt


인수구201411.csv


환자.txt


반응형
반응형

/*

 http://sosal.kr/
 * made by so_Sal
 */


 


apply() 함수는 벡터, 행렬 등의 데이터 프레임에서 row/column 단위의 계산을 할 때 함수를 쉽게 적용할 수 있도록 도와준다.

apply 함수 외에 리스트, 벡터, 테이블 형태로 결과를 반환해주는 lapply, sapply, tapply 함수에 대해 알아보자.


 

실습데이터)

> weight <- c(65.4, 55, 380, 72.2, 51, NA)

> height <- c(170, 155, NA, 173, 161, 166)

> gender <- c("M", "F","M","M","F","F")

> testDate <- c("2013/09/01", "2013/09/01", "2013/09/05", "2013/09/14", "2013/10/11", "2013/10/26")

> patients <- data.frame( weight = weight, height=height, gender=gender, testDate=testDate)


> patients.sub <- patients[ ,c("weight","height")]

> patients.sub

  weight height

1   65.4    170

2   55.0    155

3  380.0     NA

4   72.2    173

5   51.0    161

6     NA    166

 

 

- 각 환자(row)별로 몸무게와 키의 평균을 구한다
> apply(patients.sub, 1, mean)

[1] 117.7 105.0    NA 122.6 106.0    NA

 

- NA는 빼고 계산한다

> apply(patients.sub, 1, mean, na.rm=TRUE)
[1] 117.7 105.0 380.0 122.6 106.0 166.0

- 각 특성(Column)별로 평균을 구한다

> apply(patients.sub, 2, mean, na.rm=TRUE)
weight height
124.72 165.00

- 각 셀에 2를 곱해준다

MulTwo <- function(x){ return(2*x) }
> apply(patients.sub, c(1,2), MulTwo)
     weight height
[1,]  130.8    340
[2,]  110.0    310
[3,]  760.0     NA
[4,]  144.4    346
[5,]  102.0    322
[6,]     NA    332

 

 

 

 

 

lapply: 결과를 리스트 형태로 반환

sapply: 벡터, 또는 행렬의 형태로 반환 (s: simplify)

tapply: 입력값을 index에 지정한 factor 값으로 분류(그룹화)하여 매개변수로 넘어온 function을 적용하는 함수다.


 

> lapply( patients.sub, mean, na.rm = TRUE )

$weight

[1] 124.72


$height

[1] 165


> sapply( patients.sub, mean, na.rm = TRUE )

weight height 

124.72 165.00 


 

 

tapply( data, Index, function .. )

이는 index에 넘어온 level에 대해 그룹화 하는데, sql의 group by와 유사한 기능을 가진다.


> patients$gender # categorical data

[1] M F M M F F

Levels: F M


> tapply(patients$weight, patients$gender, mean, na.rm=TRUE)

       F        M 

 53.0000 172.5333 

반응형

+ Recent posts