세 가지 대안 솔루션 :
1) data.table:
패키지 melt
에서 와 동일한 기능을 사용할 수 있습니다 reshape2
(확장 및 개선 된 구현). melt
from data.table
에는 또한 melt
-function from 보다 많은 매개 변수가 있습니다 reshape2
. 예를 들어 변수 열의 이름을 지정할 수도 있습니다.
library(data.table)
long <- melt(setDT(wide), id.vars = c("Code","Country"), variable.name = "year")
이것은 다음을 제공합니다.
> long
Code Country year value
1: AFG Afghanistan 1950 20,249
2: ALB Albania 1950 8,097
3: AFG Afghanistan 1951 21,352
4: ALB Albania 1951 8,986
5: AFG Afghanistan 1952 22,532
6: ALB Albania 1952 10,058
7: AFG Afghanistan 1953 23,557
8: ALB Albania 1953 11,123
9: AFG Afghanistan 1954 24,555
10: ALB Albania 1954 12,246
대체 표기법 :
melt(setDT(wide), id.vars = 1:2, variable.name = "year")
melt(setDT(wide), measure.vars = 3:7, variable.name = "year")
melt(setDT(wide), measure.vars = as.character(1950:1954), variable.name = "year")
2) 깔끔한:
library(tidyr)
long <- wide %>% gather(year, value, -c(Code, Country))
대체 표기법 :
wide %>% gather(year, value, -Code, -Country)
wide %>% gather(year, value, -1:-2)
wide %>% gather(year, value, -(1:2))
wide %>% gather(year, value, -1, -2)
wide %>% gather(year, value, 3:7)
wide %>% gather(year, value, `1950`:`1954`)
3) 개편 2:
library(reshape2)
long <- melt(wide, id.vars = c("Code", "Country"))
동일한 결과를 제공하는 몇 가지 대체 표기법 :
# you can also define the id-variables by column number
melt(wide, id.vars = 1:2)
# as an alternative you can also specify the measure-variables
# all other variables will then be used as id-variables
melt(wide, measure.vars = 3:7)
melt(wide, measure.vars = as.character(1950:1954))
노트:
- 개편 2은퇴했습니다. CRAN을 유지하는 데 필요한 변경 만 수행됩니다. ( 소스 )
- 제외 할 경우
NA
값을, 당신은 추가 할 수 있습니다 na.rm = TRUE
받는 사람 melt
뿐만 아니라 gather
기능.
데이터의 또 다른 문제점은 값이 R에 의해 문자 값으로 읽히는 것입니다 ( ,
숫자 의 결과 ). 다음 gsub
과 as.numeric
같이 수리 할 수 있습니다 .
long$value <- as.numeric(gsub(",", "", long$value))
또는 직접으로 data.table
또는 dplyr
:
# data.table
long <- melt(setDT(wide),
id.vars = c("Code","Country"),
variable.name = "year")[, value := as.numeric(gsub(",", "", value))]
# tidyr and dplyr
long <- wide %>% gather(year, value, -c(Code,Country)) %>%
mutate(value = as.numeric(gsub(",", "", value)))
데이터:
wide <- read.table(text="Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246", header=TRUE, check.names=FALSE)