R에서 data.table을 와이드에서 롱으로 재구성하려고합니다. 감소해야 할 변수 그룹이 여러 개 있지만 한 번에 한 그룹 씩 수행하는 초기 접근 방식은 오류가 발생하기 쉽습니다. 대안. 이 재현 가능한 예 에서는 원본 데이터와 비슷한 방식으로 두 개의 변수 그룹 ( XX
및 YYY
)을 만듭니다 .
내 솔루션은이 예제에서 작동하지만 원래 데이터 테이블에는이 코드를 신뢰하기가 쉽지 않은 열이 너무 많습니다. 문제가 내 구현에 있는지 또는 접근 방식 자체에 있는지 확실하지 않습니다 . 가능 하면 간단하게 유지하는 것이 좋습니다.
Q : 이 문제를 해결하는 더 좋은 방법이 있습니까?
예제 데이터
library(data.table)
dt.orig <- data.table(ID= 1:3,
a = c("Y", "Y", "N"),
b = c("N", "Y", "Y"),
XXa=c(101, 102, 103),
XXb=c(110, 120, 130),
YYYa=c(201, 202, 203),
YYYb=c(210, 220, 230))
dt.goal <- data.table(ID=c(1,1,2,2,3,3),
obs=c("a", "b"),
outcome = c("Y", "N", "Y", "Y", "N", "Y"),
XX=c(101, 110, 102, 120, 103, 130),
YYY=c(201, 210, 202, 220, 203, 230))
> dt.orig
ID a b XXa XXb YYYa YYYb
1: 1 Y N 101 110 201 210
2: 2 Y Y 102 120 202 220
3: 3 N Y 103 130 203 230
> dt.goal
ID obs outcome XX YYY
1: 1 a Y 101 201
2: 1 b N 110 210
3: 2 a Y 102 202
4: 2 b Y 120 220
5: 3 a N 103 203
6: 3 b Y 130 230
dt.orig
원본 데이터를 나타내며 dt.goal
제가 달성하고자하는 것입니다. tidyr
패키지 비 네트를 따르는 나의 초기 시도는 다음 과 같습니다.
시도 1 : tidyr/dplyr
접근
library(tidyr)
library(dplyr)
dt.orig[, .(ID, a, b)] %>%
pivot_longer(
cols = c("a", "b"),
names_to = "obs",
values_to = "outcome"
) %>% data.table -> dt.tidyr1
dt.orig[, .(ID, XXa, XXb, YYYa, YYYb)] %>%
pivot_longer(
cols = XXa:YYYb,
names_to = c(".value", "obs"),
names_pattern = "(XX|YYY)(.)",
) %>% data.table -> dt.tidyr2
dt.tidyr1[, .(ID, obs, outcome)] == dt.goal[, .(ID, obs, outcome)] # test passes
dt.tidyr2[, .(ID, obs, XX, YYY)] == dt.goal[, .(ID, obs, XX, YYY)] # test passes
> merge(dt.tidyr1, dt.tidyr2)
ID obs outcome XX YYY
1: 1 a Y 101 201
2: 1 b N 110 210
3: 2 a Y 102 202
4: 2 b Y 120 220
5: 3 a N 103 203
6: 3 b Y 130 230
위의 코드에서 나는 처음에 이름 / 값의 쌍의 생성 obs
에서와 결과를 a
하고 b
. 모든 변수 그룹에는 이름 지정 체계가 포함 a
되어 b
있으므로이 사실을 사용하여 단일 정규식으로 모든 그룹을 전달할 수 있습니다 .
그런 다음 두 데이터 테이블을 최종 데이터 테이블로 병합하거나 조인 할 수 있습니다.
시도 2 : data.table
방법
동일한 원칙에 따라 원본 a와 b를 obs와 결과로 녹이기 시작한 다음 각 var 그룹에 대해 두 번째 단계 (간결성을 위해 여기에 표시되지 않음)를 수행 할 수 있습니다. 이 경우 한 번에 하나의 var 그룹을 녹이는 데 성공 했으므로이 예에서는 먼저 모든 XX를 수행 한 다음 모든 YYY를 수행합니다. 장점 / 단점 : 장점은 프로세스를 완료하기 위해 여러 단계 테이블을 만들 필요가 없다는 것입니다. 단점 : 실제 데이터의 모든 var 그룹을 사용하여이 접근 방식을 완료 할 커피가 충분하지 않습니다 (결과를 신뢰 함).
dt.melt1 <- melt(dt.orig,
id.vars = c("ID", "XXa", "XXb", "YYYa", "YYYb"),
measure = c("a", "b"),
variable.name = "obs",
value.name = "outcome")
나는 dplyr 버전이 괜찮다고 생각합니다. 열 수를 늘리기 위해 pivot_longer의 정규식을 더 일반적으로 만들 수 있습니다. 또한 두 번째 데이터 프레임을 만들고 병합 할 필요가 없도록 열 a와 b를 목록으로 평면화 할 수 있습니다.
# flatten cols a,b
outcome <- c(t(select(dt.orig, c(a, b))))
# pivot longer on regex and add outcome list
dt.orig %>%
pivot_longer(-c(ID, a, b),
names_to = c(".value", "obs"),
names_pattern = "(.*)(.)") %>%
mutate(outcome = outcome) %>%
select(-c(a, b))
ID obs XX YYY outcome
1 1 a 101 201 Y
2 1 b 110 210 N
3 2 a 102 202 Y
4 2 b 120 220 Y
5 3 a 103 203 N
6 3 b 130 230 Y
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다