2017-10-17 1 views
2

다음 R data.table을 가지고 있습니다 (data.frame도 함께 확장해야 함). 목표는이 data.table의 모양을 ggplot2에 산점도로 플롯하기위한 것입니다. 요소 열을 사용하여 R data.table을 녹이기

> library(data.table) 
> dt 
    ID     x_A    y_A  x_B  y_B                                                 
    1: 05AC   0.81    3   0.92  2.05                                                 
    2: 01BA   0.41    5   0.63  1.8                                                 
    3: Z1AC   0.41    5   0.58  1.8                                                 
    4: B2BA   0.21    6.5   1.00  1.8 
    .... 

내가 올바른 출력의 형식이어야합니다 생각 :

ID  type x  y 
05AC A  0.81 3  
05AC B  0.92 2.05 
01BA A  0.41 5 
01BA B  0.63 1.8 
Z1AC A  0.41 5 
Z1AC B  0.58 1.8 
B2BA A  0.21 6.5 
B2BA B  1.00 1.8 

거기인가 그래서 저는 포인트 색상을 하나의 "요소"열이이 data.table을 바꿀 필요 이런 식으로 데이터 테이블을 "펼치기"위한 표준 방법은 무엇입니까? 이 경우에는 dplyr을 사용하는 방법에 만족하지만 data.table 메소드가 있어야한다고 생각합니다.

melt() 예를 들어, 열 type을 만드는 방법을 알아낼 수 있다면 작동합니다.

melt(dt, id.vars=c("ID")) 

은 내가 특히 혼란 스러워요 ID

하나의 열을 기준으로 용융하는 방법 중 하나 "긁힌"A와 B 형 열 2-3에서 각각 열 4-5 ...

답변

3

melt를 사용하여 제안 된 접근 후, data.table 한도 내에서, 당신은 tstrsplit은 "_"문자를 기반으로 변수를 분할 할 수 있습니다.

## use tstrsplit to split a column on a regular expression 
dt[, c("xy", "type") := tstrsplit(variable, "_")] 
dt 
#  ID variable value xy type 
# 1: 05AC  x_A 0.81 x A 
# 2: 01BA  x_A 0.41 x A 
# 3: Z1AC  x_A 0.41 x A 
# 4: B2BA  x_A 0.21 x A 
# 5: 05AC  y_A 3.00 y A 
# 6: 01BA  y_A 5.00 y A 
# 7: Z1AC  y_A 5.00 y A 
# 8: B2BA  y_A 6.50 y A 
# 9: 05AC  x_B 0.92 x B 
# 10: 01BA  x_B 0.63 x B 
# 11: Z1AC  x_B 0.58 x B 
# 12: B2BA  x_B 1.00 x B 
# 13: 05AC  y_B 2.05 y B 
# 14: 01BA  y_B 1.80 y B 
# 15: Z1AC  y_B 1.80 y B 
# 16: B2BA  y_B 1.80 y B 

이렇게하면 원하는 해결책을 길게 얻을 수 있습니다. 그런 다음 그것을

dcast(dt, formula = ID + type ~ xy) 

#  ID type x y 
# 1: 01BA A 0.41 5.00 
# 2: 01BA B 0.63 1.80 
# 3: 05AC A 0.81 3.00 
# 4: 05AC B 0.92 2.05 
# 5: B2BA A 0.21 6.50 
# 6: B2BA B 1.00 1.80 
# 7: Z1AC A 0.41 5.00 
# 8: Z1AC B 0.58 1.80 

이 답변의 논리가 제안 dplyrgather %>% separate %>% spread의 접근하지만, data.table을 사용하는 것과 같습니다를 넓혀 dcast를 사용할 수 있습니다.

+0

도움 주셔서 감사합니다. 약간의 수정 : 위의 대답은 ID 변수 값을 출력합니다. 질문은 'ID 변수 x y' 출력이 필요합니다. – ShanZhengYang

+1

오 예 - – SymbolixAU

+0

@ShanZhengYang을 업데이트합니다. 편집을 참조하십시오. – SymbolixAU

2

dplyrtidyr의 조합으로 원하는 결과를 얻을 수 있습니다. 이것은 재현 할 수없는 예제로 인해 테스트되지 않았습니다.

library(tidyr) 
library(dplyr) 

dt %>% 
    gather(variable, value, -ID) %>% 
    separate(variable, c("group", "type"), sep = "\\_") %>% 
    spread(group, value, na.rm = TRUE) 

이 기능 :

  1. 는 키 - 값 행 변수 값에 ID 열을 제외한 모든 열을 수집.
  2. 은 가변 열을 그룹과 유형으로 구분하며 _을 구분 기호로 사용합니다.
  3. 그룹 행의 내용을 열에 분산시키고 값 열로 채우고 NA 조합을 제거합니다.
관련 문제