정렬 (sorting)

- 일반적으로 정렬하는 변수는 수치형이거나 문자형

- 종류: 오름차순, 내림차순

- 숫자 > 영어 > 한글

- sort(<object>, ...)

- 예시

c("a", "b", "가", "나", "1", "2")
vec = sample(c("a","b","가","나","1","2"), 10, replace = T)

sort(vec) # ascending
sort(vec, decreasing = T) # descending

sort(c("a", "b", NA), na.last = NA)
sort(c("a", "b", NA), na.last = TRUE) 
# NA의 값이 제일 뒤에 출력
sort(c("a", "b", NA), na.last = F) 
# NA의 값이 앞에서 출력

 

 

 

그룹화(grouping)

- 데이터 가공/전처리 과정 중 하나로 어떠한 특성을 기준으로 자료를 여러 개로 분할하는 작업

- 조건 활용

data(InsectSprays)
unique(InsectSprays$spray)
insect_gp.D = InsectSprays[InsectSprays$spray == "D",]
subset(InsectSprays, subset = (InsectSprays$spray == "D"))
insect_gp.D = InsectSprays[
    InsectSprays$spray == "D",
]
# 변수 SUBJECT를 기준으로 crop 자료를 분할
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[1]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[2]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[3]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[4]], n = 2)

# LOCATION에 포함된 값을 오름차순으로 저장한 목록 생성
loc.list = unique(crop$LOCATION, decreasing = F)

# 생성한 목록 내 세 번째 값을 LOCATION 값으로 가지는 관찰값을 crop3로 저장
crop3 = crop[crop$LOCATION == loc.list[3],]
### split(x = <data>, f = <key_factor>)
insect_gp = split(InsectSprays, f = InsectSprays$spray)
str(insect_gp) # list로 저장됨.
insect_gp$D # indexing
crop_split = split(crop.raw, f = crop.raw$SUBJECT)
# 이렇게 하면 원래 SUBJECT 안에 있던 값들
# "RICE"    "WHEAT"   "MAIZE"   "SOYBEAN"
# 각각의 이름으로 data 프레임이 만들어짐. 
# 한 마디로 list 안에 data frame 이 4개가 있는데
# 그 각각의 이름들이 "RICE"    "WHEAT"   "MAIZE"   "SOYBEAN"
str(crop_split)
nrow(crop_split$MAIZE) ; nrow(crop_split[[1]])
nrow(crop_split$RICE) ; nrow(crop_split[[2]])
nrow(crop_split$SOYBEAN) ; nrow(crop_split[[3]])
nrow(crop_split$WHEAT) ; nrow(crop_split[[4]])

 

근데 아래와 같이 반복해서 나타내기에는 코드가 너무 길어짐.

그래서 lapply(), sapply() 사용

- X의 각 원소에 FUN(함수)을 적용하고 그 결과를 list 또는 vector로 반환하는 함수

- lapply(x = <list>, FUN = <function>) # list로 반환

- sapply( x = <list>,  FUN = <function> )  # vector로 반환 

- apply(x, margin, FUN) 

   >> x  는 matrix 또는 data.frame , 

   >> margin 은 어느 방향으로 할 건지 1은 행방향으로 2는 열방향으로 

   >> FUN은 함수 

 

예시

lapply(crop_split, nrow)
sapply(crop_split, nrow)

mat = matrix(1:111, nrow =3 )
apply(mat, 1, sum)
apply(mat, 2, sum)

 

데이터 프레임의 경우 (apply)

tmp = crop_split[[1]][, c("LOCATION", "TIME", "Flag.Codes")]
apply(tmp, 2, table)
apply(tmp, 1, is.na) # flag.codes 전체가 NA인지 의문 발생
sum(is.na(tmp$Flag.Codes)) == nrow(tmp) # flag.codes 전체가 NA임을 확인

 

주의!

함수 apply에 열 방향(MARGIN = 2)으로 is.numeric, is.character를 적용하면 실제와 모순되는 결과가 나옴.

이것은 apply가 객체를 모두 동일한 type으로 뭉그러뜨리기 때문임. 

 

is.numeric(tmp$TIME) # time은 numeric이 맞음.
apply(tmp, 2, is.numeric) # time이 numeric이 아니라고 출력됨.
apply(tmp[,3,drop=F], 2, is.numeric) # time이 numeric이라고 출력됨.

 
예시

label = sample(c("name1", "name2", "name3"),
               size = nrow(InsectSprays),
               replace = T)


sp2 = list(name1 = InsectSprays[InsectSprays$label == "name1",],
     name2 = InsectSprays[InsectSprays$label == "name2",],
     name3 = InsectSprays[InsectSprays$label == "name3",])

InsectSprays = cbind(InsectSprays, label)

sp = split(InsectSprays, InsectSprays$label)

sp2는 그냥 하나하나 정성스럽게 list에다가 넣은 것이고

sp는 split으로 label을 기준으로 나눈 것

+ Recent posts