setwd('c:/users/is2js/R_da/')

#### Pivoting ####


# 1. reshape2 패키지 설치
install.packages("reshape2")

set.seed(123)
df = data.frame(Obs = 1:4,
                 A = sample(10:99, size = 4),
                 B = sample(10:99, size = 4),
                 C = sample(10:99, size = 4))
df
image


# 2. melt()함수를 통해 여러개의 칼럼을 --> 한칼럼에 세로로 늘어트린다.
# - melt(df, id.vars = "식별 칼럼명Obs", Variable.name = "여러개의 칼럼을 하나로 뭉친 칼럼명", value.name = "각 값들이 나올 칼럼명")
library("reshape2")
df_melt = melt(df, id.vars = "Obs",
                variable.name = "Group", value.name = "Count")
df_melt
image
# 만약 variable.name(뭉친칼럼명)과 value.name(값 칼럼명)을 안넣어주면 default한 칼럼명(variable칼럼 / value칼럼)이 생긴다.
df_melt_default = melt(df, id.vars = "Obs") # 식별 칼럼명도 안넣어주면, 그것까지 뭉친칼럼으로 들어간다.
image


# 3. dcast()와 acast()
# melt형태의 df를 값별로 여러개의 칼럼을 만드는데
# 추가적으로, melt된 형태의 데이터를 dcast()를 통해 여러개의 칼럼으로 흐트려 놓으면 각 칼럼별 NA값을 쉽게 확인할 수 있다.
# 게다가    , fill = 인자를 통해 결측값을 채울 수 도 있다.
# 게다가    , fun.aggregate = length(개수),sum(합) 등 요약 정보도 확인할 수 있다.
#  - dcast(df_melt, formula = 식별칼럼명 ~ 뭉친칼럼명, value.var = "값을 가진 칼럼명")
#  - acast(df_melt, formula = 식별칼럼명 ~ 뭉친칼럼명, value.var = "값을 가진 칼럼명")
#   > dcast와 동일하나, 식별칼럼Obs를 없앤 df를 생성
dcast(data = df_melt, formula = Obs ~ Group, value.var = "Count")
image
acast(data = df_melt, formula = Obs ~ Group, value.var = "Count")
image

# 데이터를 일부 뺀상태에서 dcast()하여 NA로 만들고 관찰하기
dcast(data = df_melt[-(2:5),], formula = Obs ~ Group, value.var = "Count")
image
# - 세로로 녹여진 df_melt의 2행~5행까지를 빼먹고 dcast()하면,
# - dcast()결과는 각 칼럼별로 결측값을 쉽게 확인할 수 있다.
dcast(data = df_melt[-(2:5),], formula = Obs ~ Group, value.var = "Count",
       fill="NA래요!")
image



# 4. t()함수 2번 감싸주기를 이용한 1차원 행렬(1,n) --대각선기준 접기--> n차원 행렬(n,1)로 나타내면
# - n행이 되므로 colnames()같은 정보를 한눈에 쉽게 볼 수 있다.
?t
data("CO2")
head(CO2)

df = cbind(CO2, CO2) # cbind()로 칼럼수가 여러개가 되도록 임의 조정
df
colnames(df)

# 그냥 colnames개수만큼(length(colnames(df)) or ncol(df))
# paste0() + letters를 이용하여 다른걸로 바꿔주자.
colnames(df) = paste0("CO2_", sample(LETTERS,  length( colnames(df) )     ))
colnames(df)
head(df)
ncol(df)
# *** 일반 원소에 t()를 2번 감싸면 세로로 쭈욱 생긴다.
t(colnames(df))
image
t(t(colnames(df)))
image

+ Recent posts