> vec1 <- c('one','two','three')
> vec2 <- c(1,2,3)
> rbind(vec1,vec2)
[,1] [,2] [,3]
vec1 "one" "two" "three"
vec2 "1" "2" "3"
> #두 벡터를 각각 row로하는 datafrmae을 만들고 싶은면 ? : rbind
> vec1 <- c('one','two','three')
> vec2 <- c(1,2,3)
> cbind(vec1,vec2)
vec1 vec2
[1,] "one" "1"
[2,] "two" "2"
[3,] "three" "3"
> #두 벡터를 각각 column으로하는 datafrmae을 만들고 싶은면 ? : cbind
> df <- data.frame(cbind(vec1,vec2))
> str(df)
'data.frame': 3 obs. of 2 variables:
$ vec1: Factor w/ 3 levels "one","three",..: 1 3 2
$ vec2: Factor w/ 3 levels "1","2","3": 1 2 3
> #그런데 위의 방법은 str(df)에서 보듯이, 숫자든, 문자든 모두 factor로 인식하게 됩니다. 그럴땐, cbind.data.frame이라는 함수를 사용한다.
> cbind.data.frame(vec1,vec2)
vec1 vec2
1 one 1
2 two 2
3 three 3
> df <- cbind.data.frame(vec1, vec2, stringAsFactors = F)
> str(df)
'data.frame': 3 obs. of 3 variables:
$ vec1 : Factor w/ 3 levels "one","three",..: 1 3 2
$ vec2 : num 1 2 3
$ stringAsFactors: logi FALSE FALSE FALSE
>
>
> #apply 함수 이해하기
> 행렬 혹은 data.frame
Error: unexpected symbol in "행렬 혹은"
> #행렬 혹은 data.frame에서 각 row,column에 대해 평균을 계산한다든지, 특정 함수를 적용하고 싶을 때가 있죠, 이럴때, 가장 기본적으로 생각하는게 for loop 르 활용하여 각 row(혹은 column) 별로 함수를 적용합니다.
> mat <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3)
> #각 row의 평균을 계산하고 싶다면
> for (i in seq(1:nrow(mat))) {
+ print(mean(mat[i,]))
+ }
[1] 4
[1] 5
[1] 6
> #그런데 많은 양의 데이터를 for loop 하는것은 비효율적이다.
> # 매범 for loop를 돌때마다 함수를 불러와야하기때문이다...
> # apply는 한 번만 함수를 불러와서 모든 데이터를 적용하기 때문에 훨씬 시간을 줄일수있다.
> mat <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3)
> apply(mat, 1, mean) #mean이라는 함수를 row(1)로 적용
[1] 4 5 6
> apply(mat, 2, mean) #mean이라는 함수를 column(2) 별로 적용
[1] 2 5 8
> apply(mat, 3, mean)
Error in if (d2 == 0L) { : missing value where TRUE/FALSE needed
> apply(mat, 2, mean)
[1] 2 5 8
> apply(mat, 1, range)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 7 8 9
> #list, vector에 대한 for loop 계산
> 데이터 프레임과 마찬가지로 list, vector에 대해서도 for loop를 최소화 하는 것이 좋습니다. 대신, apply와 비슷하게 lapply, sapply를 사용합니다. 좀 더 구체적으로 예를 들어보면, 리스트 (1,2,3)을 제곱한 값을 반환하고 싶다고 합시다. 그래서 아래와 같이 계산하면 실행이 안되죠. list는 vector처럼 연산 함수가 적용되지 않습니다.
Error: unexpected symbol in "데이터 프레임과"
>
>
>
>
>
>
>
>
>
> lst <- list(1,2,3,4)
> lst
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
> lst^2
Error in lst^2 : non-numeric argument to binary operator
> lst <- list(1,2,3)
> lst
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
> lst^2
Error in lst^2 : non-numeric argument to binary operator
> #lapply(벡터 혹은 리스트, 함수)
> #sapply(벡터 혹은 리스트, 함수)
> #lapply 이용하면
> lst <- list(1,2,3)
> lapply(lst, function(x){x^2})
[[1]]
[1] 1
[[2]]
[1] 4
[[3]]
[1] 9
> sapply(lst, function(x){x^2})
[1] 1 4 9
> lapply, sapply도 data.frame 에 적용할 수 있는데, apply는 결과값이 data.frame인 반면, lapply, sapply는 결과값이 각각 list, vector 라는 차이가 있습니다. 그리고 기본적으로 각 column에 대해 함수가 적용됩니다.
Error: unexpected ',' in "lapply,"
> lst <- lapply(iris[,1:4],sum)
> class(lst)
[1] "list"
> vec <- sapply(iris[,1:4], sum)
> class(vec)
[1] "numeric"
> #iris 데이터의 각 데이터 타입을 보고 싶다면 ?
> sapply(iris, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width
"numeric" "numeric" "numeric" "numeric"
Species
"factor"
> #3보다 큰 값만 추출하고 싶으면?
> y <- sapply(iris[,1:4], function(x){x>3})
> y
카테고리 없음
R dataframe row/column추가 및 apply함수 이해하기
반응형
반응형