2개의 변수를 사용하여 데이터 프레임을 넓은 형식에서 긴 형식으로 변환합니다.
문제
다음과 같은 넓은 데이터 프레임(mydf.wide)이 있습니다.
DAY JAN F1 FEB F2 MAR F3 APR F4 MAY F5 JUN F6 JUL F7 AUG F8 SEP F9 OCT F10 NOV F11 DEC F12
1 169 0 296 0 1095 0 599 0 1361 0 1746 0 2411 0 2516 0 1614 0 908 0 488 0 209 0
2 193 0 554 0 1085 0 1820 0 1723 0 2787 0 2548 0 1402 0 1633 0 897 0 411 0 250 0
3 246 0 533 0 1111 0 1817 0 2238 0 2747 0 1575 0 1912 0 705 0 813 0 156 0 164 0
4 222 0 547 0 1125 0 1789 0 2181 0 2309 0 1569 0 1798 0 1463 0 878 0 241 0 230 0
다음과 같은 "세미롱"을 제작하고 싶습니다.
DAY variable_month value_month value_F
1 JAN 169 0
나는 시도했다:
library(reshape2)
mydf.long <- melt(mydf.wide, id.vars=c("YEAR","DAY"), measure.vars=c("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"))
하지만 이것은 F 변수를 건너뛰고 두 변수를 처리하는 방법을 모르겠습니다...
해결책
기본 R의 reshape(...)
가 더 나은 옵션 인 경우 그 중 하나입니다.
months <- c(2,4,6,8,10,12,14,16,18,20,22,24) # column numbers of months
F <- c(3,5,7,9,11,13,15,17,19,21,23,25) # column numbers of Fn
mydf.long <- reshape(mydf.wide,idvar=1,
times=colnames(mydf.wide)[months],
varying=list(months,F),
v.names=c("value_month","value_F"),
direction="long")
colnames(mydf.long)[2] <- "variable_month"
head(mydf.long)
# DAY variable_month value_month value_F
# 1.JAN 1 JAN 169 0
# 2.JAN 2 JAN 193 0
# 3.JAN 3 JAN 246 0
# 4.JAN 4 JAN 222 0
# 1.FEB 1 FEB 296 0
# 2.FEB 2 FEB 554 0
.
melt(...)
library(reshape2)
months <- c(2,4,6,8,10,12,14,16,18,20,22,24) # column numbers of months
F <- c(3,5,7,9,11,13,15,17,19,21,23,25) # column numbers of Fn
z.1 <- melt(mydf.wide,id=1,measure=months,
variable.name="variable_month",value.name="value_month")
z.2 <- melt(mydf.wide,id=1,measure=F,value.name="value_F")
mydf.long <- cbind(z.1,value_F=z.2$value_F)
head(mydf.long)
# DAY variable_month value_month z.2$value_F
# 1 1 JAN 169 0
# 2 2 JAN 193 0
# 3 3 JAN 246 0
# 4 4 JAN 222 0
# 5 1 FEB 296 0
# 6 2 FEB 554 0
. 다른 팁
melt()
그리고 dcast()
에서 구할 수 있습니다 reshape2
그리고 data.table
패키지.최신 버전의 data.table
허락하다 melt
동시에 여러 열.그만큼 patterns()
매개변수를 사용하면 정규 표현식으로 두 개의 열 집합을 지정할 수 있습니다.
library(data.table) # CRAN version 1.10.4 used
regex_month <- toupper(paste(month.abb, collapse = "|"))
mydf.long <- melt(setDT(mydf.wide), measure.vars = patterns(regex_month, "F\\d"),
value.name = c("MONTH", "F"))
# rename factor levels
mydf.long[, variable := forcats::lvls_revalue(variable, toupper(month.abb))][]
DAY variable MONTH F 1: 1 JAN 169 0 2: 2 JAN 193 0 3: 3 JAN 246 0 4: 4 JAN 222 0 5: 1 FEB 296 0 ... 44: 4 NOV 241 0 45: 1 DEC 209 0 46: 2 DEC 250 0 47: 3 DEC 164 0 48: 4 DEC 230 0 DAY variable MONTH F
참고하세요 "F\\d"
에서 정규식으로 사용됩니다. patterns()
.간단한 "F"
잡았을 것이다 FEB
게다가 F1
, F2
, 등.예상치 못한 결과를 낳는다.
또한 참고하세요 mydf.wide
강제로 해야 한다. data.table
물체.그렇지 않으면, reshape2::melt()
인식하지 못하는 data.frame 객체로 전달됩니다. patterns()
.
데이터
library(data.table)
mydf.wide <- fread(
"DAY JAN F1 FEB F2 MAR F3 APR F4 MAY F5 JUN F6 JUL F7 AUG F8 SEP F9 OCT F10 NOV F11 DEC F12
1 169 0 296 0 1095 0 599 0 1361 0 1746 0 2411 0 2516 0 1614 0 908 0 488 0 209 0
2 193 0 554 0 1085 0 1820 0 1723 0 2787 0 2548 0 1402 0 1633 0 897 0 411 0 250 0
3 246 0 533 0 1111 0 1817 0 2238 0 2747 0 1575 0 1912 0 705 0 813 0 156 0 164 0
4 222 0 547 0 1125 0 1789 0 2181 0 2309 0 1569 0 1798 0 1463 0 878 0 241 0 230 0",
data.table = FALSE)
제휴하지 않습니다 StackOverflow