[withR]생각대로 하는 데이터핸들링(Data Handling) — apply함수들

Neo Jeong
신나는연구소
Published in
6 min readMar 1, 2020

데이터 분석에 가장 지루한 부분이지만, 가장 중요한 기본기 중에 하나인 데이터핸들링(Data Handling)을 다뤄보자.

이번 포스팅에서는 apply함수들에 대해서 서술하고자 한다.
apply,lapply, sapply, tapply, mapply는 백터 연산을 할 수 있도록 만드는 함수들이다.

먼저 apply부터 시작해보자
d = matrix(1:9, ncol=3) #메트릭스 생성

#matrix

apply()는 apply(matrix,1 or 2, 함수)형식으로 입력하며, 1일 경우는 행 연산 , 2일 때는 열 연산이 실행되고, 결과를 백터로 출력한다.
apply(d,1,sum)
[1] 12 15 18
apply(d,2,sum)
[1] 6 15 24
위 행렬과 계산된 결과값을 비교해보면 좀더 쉽게 이해 할 수 있다.
#colSums(), rowSums(), rowMeans(),colMeans()등 유사한 기능을 하는 함수들도 있음.

lapply는 lapply(x,함수)형태로 사용되며, x는 백터 또는 리스트 이며, 결과값은 리스트로 출력된다.
result=lapply(1:3, function(x){x*2})

#is.list()

is.list()는 해당 값이 리스트인지 아닌지 판별하는 함수이고, 결과가 TURE로 리스트 임을 알 수 있다.

lapply(iris[,1:4],mean)와 colMeans(iris[,1:4],mean)은 같은 결과값을 나타낸다.
차이는 리스트냐 백터냐의 자료 형태이다.

#리스트 결과같을 데이터 프레임으로 변환과정
a=lapply(iris[,1:4],mean)
matrix(unlist(a))
b=as.data.frame(matrix(unlist(a),ncol=4, byrow=TRUE))
names(b)=names(iris[,1:4])
b

#do.call(호출할 함수, 파라미터)를 사용하여 lapply가 반환한 리스트 결과를 cbind하여 합치기
data.frame(do.call(cbind, lapply(iris[,1:4],mean)))

#unlist는 문자열과 숫자가 혼합된 경우에는 문자가 이상한 값으로 바뀜
#그래서 바로 do.call을 사용
#데이터 양이 많을 때는 rbindlist를 사용해야함.
x=list(data.frame(name=”foo”, value=1),
data.frame(name=”bar”, value=2))
unlist(x)
do.call(rbind,x)

lapply()는 결과값을 리스트로, sapply()는 결과값을 백터로 출력한다.
lapply(iris[,1:4], mean)
sapply(iris[,1:4], mean)

백터로 저장된 값을 데이터 프레임 형태로 바꿀수 있다.
x=sapply(iris[,1:4],mean)
as.data.frame(x)
as.data.frame(t(x)) #t()는 행과 열을 바꾸는 함수

sapply와 class함수를 같이 사용하면, 각 열의 속성을 확인하는데 사용할 수 도 있다.
sapply(iris,class)

#sapply()와 class

sapply()에 인자로 주어진 함수의 출력이 여러행이라면 행렬로 반환된다.
sapply()는 한가지 타입만 저장가능한 데이터 타입인 백터, 행렬, 배열이 반환기 때문에, 반환되는 결과값이 여러가지 데이터 타입이 섞이면 실행되지 않는다. (plyr패키지를 사용하면됨)
y=sapply(iris[,1:4], function(x){x>3})
class(y)
head(y)

#matrix

그룹별 처리를 위한 함수 tapply(데이터,색인,함수) 가 있다.
tapply(1:10,rep(1,10), sum)
tapply(1:10,1:10%%2==1,sum)

색인부분이 그룹을 지정하는 부분으로, 연산이 들어갈 수도 있다.

잎의 길이를 꽃 종류 별로 묶어서 평균 구하기
tapply(iris$Sepal.Length, iris$Species, mean)

m=matrix(1:8, ncol=2, dimnames=list(c(“spring”,”summer”,”fall”,”winter”),
c(“male”,”female”)))
rownames(m)
m1=tapply(m, list(c(1,1,2,2,1,1,2,2),c(1,1,1,1,2,2,2,2)),sum)
rownames(m1)=c(“상반기”,”하반기”)
colnames(m1)=c(“남자”,”여자”)
m1

mapply는 sapply와 유사하지만 다수에 인자를 넘기는 부분이 조금 다르다
mapply(function(i,s){
sprintf(“%d%s”,i,s)
},1:3,c(“a”,”b”,”c”))

데이터핸들링(Data Handling)은 정해진 기술이 있는것이 아니라, 데이터의 특성을 파악해 어떤식으로 가공해야 분석하기 용이 할지 판단해, 데이터를 적절히 나누고 다시 재조합하는 능력을 필요로 하며, 여러 함수를 이용해서 자기만에 방법을 익히는게 가장 중요하게 생각된다.

--

--

Neo Jeong
신나는연구소

#Data Analyst #세상을 보는 데이터 분석가 #책을 읽는 몽상가