English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

R 데이터 리셋

데이터 프레임 병합

R 언어 데이터 프레임 병합 사용 merge() 함수。

merge() 함수 문법 형식은 다음과 같습니다:

# S3 메서드
merge(x, y, …)
# data.frame의 S3 메서드 
merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x", ".y"), no.dups = TRUE,
      incomparables = NULL, …)

일반 파라미터 설명:

  • x, y:데이터 프레임

  • by, by.x, by.y:두 데이터 프레임의 매치 열 이름을 지정합니다. 기본적으로 두 데이터 프레임의 동일한 열 이름을 사용합니다.

  • all:정리 값; all = L은 all.x = L과 all.y = L의 줄임말입니다. L은 TRUE 또는 FALSE일 수 있습니다.

  • all.x:정리 값, 기본적으로 FALSE입니다. TRUE로 설정되면 y에 해당하는 매치가 없더라도 x에 매치되는 행을 표시합니다. y에 매치가 없는 행은 NA로 표시됩니다.

  • all.y:정리 값, 기본적으로 FALSE입니다. TRUE로 설정되면 x에 해당하는 매치가 없더라도 y에 매치되는 행을 표시합니다. x에 매치가 없는 행은 NA로 표시됩니다.

  • sort:정리 값, 열을 정렬할지 여부입니다.

merge() 함수와 SQL의 JOIN 기능이 매우 유사합니다:

  • Natural join 또는 INNER JOIN:테이블에 최소한 하나의 매치가 있으면 행을 반환합니다

  • Left outer join 또는 LEFT JOIN:우측 테이블에 매치가 없더라도 좌측 테이블의 모든 행을 반환합니다

  • Right outer join 또는 RIGHT JOIN:좌측 테이블에 매치가 없더라도 우측 테이블의 모든 행을 반환합니다

  • Full outer join 또는 FULL JOIN:只要其中一个表中存在匹配,则返回行

# data frame 1
df1 = data.frame(SiteId = c(1:6), Site = c("Google", "w3codebox", "Taobao", "Facebook", "Zhihu", "Weibo"))
# data frame 2
df2 = data.frame(SiteId = c(2, 4, 6, 7, 8), Country = c("CN","USA","CN","USA","IN")) 
# INNER JOIN 
df1 = merge(x=df1,y=df2,by="SiteId")
print("----- INNER JOIN -----)
print(df1)
# FULL JOIN
df2 = merge(x=df1,y=df2,by="SiteId",all=TRUE)
print("----- FULL JOIN -----)
print(df2)
# LEFT JOIN
df3 = merge(x=df1,y=df2,by="SiteId",all.x=TRUE)
print("----- LEFT JOIN -----)
print(df3)
# RIGHT JOIN
df4 = merge(x=df1,y=df2,by="SiteId",all.y=TRUE)
print("----- RIGHT JOIN -----)
print(df4)

위의 코드를 실행한 결과는 다음과 같습니다:

[1] "----- INNER JOIN -----"
  SiteId     Site Country
1      2   w3codebox      CN
2      4 Facebook     USA
3      6    Weibo      CN
[1] "----- FULL JOIN -----"
  SiteId     Site Country.x Country.y
1      2   w3codebox        CN        CN
2      4 Facebook       USA       USA
3      6    Weibo        CN        CN
4      7     <NA>      <NA>       USA
5      8     <NA>      <NA>        IN
[1] "----- LEFT JOIN -----"
  SiteId   Site.x Country   Site.y Country.x Country.y
1      2   w3codebox      CN   w3codebox        CN        CN
2      4 Facebook     USA Facebook       USA        USA
3      6    Weibo      CN    Weibo        CN        CN
[1] "----- RIGHT JOIN -----"
  SiteId   Site.x Country   Site.y Country.x Country.y
1      2   w3codebox      CN   w3codebox        CN        CN
2      4 Facebook     USA Facebook       USA        USA
3      6    Weibo      CN    Weibo        CN        CN
4      7     <NA>    <NA>     <NA>      <NA>       USA
5      8     <NA>    <NA>     <NA>      <NA>        IN

데이터 통합 및 분할

R 언어에서 사용됩니다 melt()cast() 데이터 통합 및 분할에 사용되는 함수입니다.

  • melt() : 넓은 형식 데이터를 장 형식으로 변환합니다.

  • cast() : 장 형식 데이터를 넓은 형식으로 변환합니다.

아래 그림은 melt()와 cast() 함수의 기능을 잘 보여줍니다(이후 예제에서 자세히 설명됩니다):

melt()은 데이터 셋의 각 열을 하나의 열로 쌓아집니다, 함수 문법 형식:

melt(data, ..., na.rm = FALSE, value.name = "value")

파라미터 설명:

  • data: 데이터 셋.

  • ...: 다른 메서드에 전달되거나 다른 메서드에서 전달된 다른 매개변수.

  • na.rm: 데이터 셋에서 NA 값을 제거할지 여부.

  • value.name 변수 이름, 값을 저장하는 데 사용됩니다.

다음 작업을 수행하기 전에, 먼저 필요한 패키지를 설치합니다:

# 라이브러리를 설치합니다, MASS는 많은 통계 관련 함수, 도구 및 데이터 세트를 포함합니다
install.packages("MASS", repos = "https://mirrors.ustc.edu.cn/CRAN/) 
  
# melt()과 cast() 함수는 라이브러리에 대한 필요성이 있습니다 
install.packages("reshape2", repos = "https://mirrors.ustc.edu.cn/CRAN/) 
install.packages("reshape", repos = "https://mirrors.ustc.edu.cn/CRAN/)

테스트 예제:

# 라이브러리 로드
library(MASS) 
library(reshape2) 
library(reshape) 
  
# 데이터 프레임 생성
id<- c(1, 1, 2, 2) 
time <- c(1, 2, 1, 2) 
x1 <- c(5, 3, 6, 2) 
x2 <- c(6, 5, 1, 4) 
mydata <- data.frame(id, time, x1, x2) 
  
# 원본 데이터 프레임
cat("원본 데이터 프레임:\n") 
print(mydata) 
# 통합
md <- melt(mydata, id = c("id","time")) 
  
cat("\n통합 후:\n") 
print(md)

위의 코드를 실행한 결과는 다음과 같습니다:

원본 데이터 프레임:
id 시간 x1 x2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
통합 후:
id time variable value
1  1    1       x1     5
2  1    2       x1     3
3  2    1       x1     6
4  2    2       x1     2
5  1    1       x2     6
6  1    2       x2     5
7  2    1       x2     1
8  2    2       x2     4

cast 함수는 결합된 데이터 프레임을 원래 형식으로 되돌리는 데 사용되며, dcast()는 데이터 프레임을 반환하며, acast()는 벡터를 반환합니다/행렬/배열.

cast() 함수 문법 형식:

dcast(
  data,
  formula,
  fun.aggregate = NULL,
  ...
  margins = NULL,
  subset = NULL,
  fill = NULL,
  drop = TRUE,
  value.var = guess_value(data)
)
acast(
  data,
  formula,
  fun.aggregate = NULL,
  ...
  margins = NULL,
  subset = NULL,
  fill = NULL,
  drop = TRUE,
  value.var = guess_value(data)
)

파라미터 설명:

  • data: 결합된 데이터 프레임.

  • formula: 재구성된 데이터의 형식, x ~ y 형식과 유사합니다, x는 행 레이블, y는 열 레이블입니다.

  • fun.aggregate: value 값을 처리하는 데 사용되는 집계 함수.

  • margins: 변수 이름의 벡터( "grand\_col" 과 "grand\_row"를 포함할 수 있습니다), 각각의 각도를 계산하는 데 사용되며, TURE를 설정하면 모든 각도를 계산합니다.

  • subset: 결과를 조건별로 필터링합니다, 형식은 유사합니다 subset = .(variable=="length")

  • drop: 기본 값 유지 여부.

  • value.var: 처리할 필드 뒤에 따르는 값.

# 라이브러리 로드
library(MASS) 
library(reshape2) 
library(reshape) 
  
# 데이터 프레임 생성
id<- c(1, 1, 2, 2) 
time <- c(1, 2, 1, 2) 
x1 <- c(5, 3, 6, 2) 
x2 <- c(6, 5, 1, 4) 
mydata <- data.frame(id, time, x1, x2) 
# 통합
md <- melt(mydata, id = c("id","time")) 
# Recasted dataset을 cast() 함수로 출력 
cast.data <- cast(md, id~variable, mean) 
  
print(cast.data) 
  
cat("\n") 
time.cast <- cast(md, time~variable, mean) 
print(time.cast) 
cat("\n") 
id.time <- cast(md, id~time, mean) 
print(id.time) 
cat("\n") 
id.time.cast <- cast(md, id+time~variable) 
print(id.time.cast) 
cat("\n") 
id.variable.time <- cast(md, id+variable~time) 
print(id.variable.time) 
cat("\n") 
id.variable.time2 <- cast(md, id~variable+time) 
print(id.variable.time2)

위의 코드를 실행한 결과는 다음과 같습니다:

id x1  x2
1  1  4 5.5
2  2  4 2.5
  시간 x1  x2
1    1 5.5 3.5
2    2 2.5 4.5
  id   1 2
1  1 5.5 4
2  2 3.5 3
  id 시간 x1 x2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
  id 변수 1 2
1  1       x1 5 3
2  1       x2 6 5
3  2       x1 6 2
4  2       x2 1 4
  id x1_1 x1_2 x2_1 x2_2
1  1    5    3    6    5
2  2    6    2    1    4