variable label in r




data.frame을 넓은 형식에서 긴 형식으로 재구성 (4)

세 가지 대안 솔루션 :

1 : reshape2

library(reshape2)
long <- melt(wide, id.vars = c("Code", "Country"))

주는 :

   Code     Country variable  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

동일한 결과를주는 대체 표기법 :

# 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 : data.table

reshape2 패키지에서와 같은 melt 기능을 사용할 수 있습니다 (확장 및 개선 된 구현). data.table 에는 data.table 가 더 많은 매개 변수가 있습니다. exaple을 사용하여 variable-column의 이름을 지정할 수도 있습니다.

library(data.table)
long <- melt(setDT(wide), id.vars=c("Code","Country"), variable.name="year")

몇 가지 대체 표기법 :

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")

3 : tidyr

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`)

NA 값을 제외 시키려면 na.rm = TRUEna.rm = TRUE 함수와 gather 함수에 추가하면됩니다.

데이터의 또 다른 문제점은 값이 문자 - 값 (숫자의 결과로)으로 R에 의해 읽혀질 것이라는 점입니다. gsubas.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)

data.frame 을 넓은 테이블에서 긴 테이블로 변환하는 데 어려움이 있습니다. 지금은 다음과 같이 보입니다.

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

이제이 data.frame 을 긴 data.frame 으로 변환하고 싶습니다. 이 같은:

Code Country        Year    Value
AFG  Afghanistan    1950    20,249
AFG  Afghanistan    1951    21,352
AFG  Afghanistan    1952    22,532
AFG  Afghanistan    1953    23,557
AFG  Afghanistan    1954    24,555
ALB  Albania        1950    8,097
ALB  Albania        1951    8,986
ALB  Albania        1952    10,058
ALB  Albania        1953    11,123
ALB  Albania        1954    12,246

나는 어떤 사람들이 비슷한 질문을하고있는 것처럼 melt()reshape() 함수를 보았고 이미 시도했다. 그러나, 지금까지 나는 단지 더러운 결과를 얻는다.

가능하다면 좀 더 멋지게 처리하기 때문에 reshape() 함수로 처리하고 싶습니다.


여기 tidyr gather 에서의 tidyr 사용을 보여주는 또 다른 예가 있습니다. gather 할 열을 개별적으로 (여기에서와 같이) 제거하거나 명시 적으로 원하는 연도를 포함하여 선택할 수 있습니다.

쉼표 (및 check.names = FALSE 가 설정되지 않은 경우 X가 추가됨)를 처리하기 위해 dplyrparse_number 와 함께 parse_number 의 mutate를 사용하여 텍스트 값을 다시 숫자로 변환합니다. 이것들은 모두 tidyverse 일부이므로 library(tidyverse) 와 함께로드 할 수 있습니다.

wide %>%
  gather(Year, Value, -Code, -Country) %>%
  mutate(Year = parse_number(Year)
         , Value = parse_number(Value))

보고:

   Code     Country Year Value
1   AFG Afghanistan 1950 20249
2   ALB     Albania 1950  8097
3   AFG Afghanistan 1951 21352
4   ALB     Albania 1951  8986
5   AFG Afghanistan 1952 22532
6   ALB     Albania 1952 10058
7   AFG Afghanistan 1953 23557
8   ALB     Albania 1953 11123
9   AFG Afghanistan 1954 24555
10  ALB     Albania 1954 12246

reshape()melt / cast 와 같이 melt 익숙해집니다. 데이터 프레임이 d 라고 가정하면 변형 된 솔루션이 있습니다.

reshape(d, direction = "long", varying = list(names(d)[3:7]), v.names = "Value", 
        idvar = c("Code","Country"), timevar = "Year", times = 1950:1954)

재구성 패키지 사용 :

#data
x <- read.table(textConnection(
"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)

library(reshape)

x2 <- melt(x, id = c("Code", "Country"), variable_name = "Year")
x2[,"Year"] <- as.numeric(gsub("X", "" , x2[,"Year"]))






r-faq