다음 데이터 프레임을 다시 정렬하는 데 문제가 있습니다.
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
각 고유 한 “name”변수가 행 이름이되도록 행 이름을 바꾸고 싶습니다. “values”는 해당 행을 따라 관측 값이되고 “numbers”는 colnames입니다. 이런 종류의 :
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
내가 검토 한 melt
과 cast
및 몇 가지 다른 것들, 그러나 아무도이 일을 할 것 없습니다.
답변
reshape
기능 사용하기 :
reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
답변
새로운 (2014 년) tidyr
패키지도 함께 간단하게이 작업을 수행 gather()
/ spread()
에 대한 조항 인 melt
/을 cast
.
편집 : 자, 2019 년, tidyr V 1.0이 출시 설정 한 spread
및 gather
더 이상 사용되지 경로 대신 선호 pivot_wider
하고 pivot_longer
당신이 설명 찾을 수있는 이 답변에 . 의 짧은 인생을 간략하게 살펴보고 싶다면 계속 읽으십시오 spread/gather
.
library(tidyr)
spread(dat1, key = numbers, value = value)
에서 github에 ,
tidyr
의 프레이밍입니다reshape2
깔끔한 데이터 프레임 워크를 동반하도록 설계, 작업 손으로 손에로magrittr
와dplyr
데이터 분석을위한 견고한 파이프 라인을 구축하는.그냥 같은
reshape2
모양 변경보다 덜했다,tidyr
이하 않습니다reshape2
. 일반적인 형태 변경reshape2
이나 형태 변경이 이루어진 일반적인 집계가 아닌 데이터 정리를 위해 특별히 설계되었습니다 . 특히 기본 제공 방법은 데이터 프레임에서만 작동하며tidyr
여백이나 집계를 제공하지 않습니다.
답변
reshape()
기능 또는 형태 변경 패키지 의 melt()
/ cast()
기능을 사용 하여이 작업을 수행 할 수 있습니다 . 두 번째 옵션의 경우 예제 코드는
library(reshape)
cast(dat1, name ~ numbers)
또는 사용 reshape2
library(reshape2)
dcast(dat1, name ~ numbers)
답변
성능이 문제가 될 경우 또 다른 옵션은 data.table
의 확장 reshape2
기능을 사용하는 것입니다.
( 참조 : data.tables를 사용하여 효율적인 재 형성 )
library(data.table)
setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")
# name 1 2 3 4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
그리고 data.table v1.9.6부터 여러 열에 캐스트 할 수 있습니다
## add an extra column
dat1[, value2 := value * 2]
## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))
# name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4
# 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
답변
예제 데이터 프레임을 사용하여 다음을 수행 할 수 있습니다.
xtabs(value ~ name + numbers, data = dat1)
답변
다른 두 가지 옵션 :
기본 패키지 :
df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df
sqldf
꾸러미:
library(sqldf)
sqldf('SELECT name,
MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1,
MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
FROM dat1
GROUP BY name')
답변
기본 R aggregate
기능 사용 :
aggregate(value ~ name, dat1, I)
# name value.1 value.2 value.3 value.4
#1 firstName 0.4145 -0.4747 0.0659 -0.5024
#2 secondName -0.8259 0.1669 -0.8962 0.1681