2017-05-23 6 views
1

각 개인 (행)이 변수 당 두 개의 데이터 포인트를 갖는 데이터 프레임이 있습니다.변수의 2 열에 ID 할당

예 데이터 :

df1 <- read.table(text = "IID L1.1 L1.2 L2.1 L2.2 
         1 1 38V1 38V1 48V1 52V1 
         2 2 36V1 38V2 50V1 48Y1 
         3 3 37Y1 36V1 50V2 48V1 
         4 4 38V2 36V2 52V1 50V2", 
    stringsAsFactor = FALSE, header = TRUE) 

나는 전체 데이터 세트에서이보다 더 많은 열이 두 열을 통해 고유 식별자를 레이블이 값을 코딩하고 싶습니다. 나는 식별자를 얻고 이전 질문 (Creating a unique IDHow to assign a unique ID number to each group of identical values in a column)에서 단일 열을 다시 레이블하는 방법을 알고 있지만 R이 열마다 요소를 식별하고 레이블을 지정하므로 두 열에 대한 정보를 포함하는 방법을 알지 못합니다.

는 궁극적으로 나는 위의 데이터를 다음과 같이 무언가를 원하는 :

(df2) 
    IID L1.1 L1.2 L2.1 L2.2 
1 1 1 1 1 4 
2 2 2 4 2 5 
3 3 3 2 3 1 
4 4 1 5 4 3 

정말 숫자만큼 그들이 모두 열에서 고유 값을 나타냅니다으로, 어떤 문제가되지 않습니다. 나는의 출력에 따라 기능을 만드는 시도했다 :

unique(df1[,1:2]) 

을하지만,이 같은 어려움을 겪고 있어요 아직도 두 걸쳐, 열마다 고유 한 항목을 살펴 봅니다.

답변

2
일 것 같은

뭔가 ...

pairs <- (ncol(df1)-1)/2 
for(i in 1:pairs){ 
    refs <- unique(c(df1[,2*i],df1[,2*i+1])) 
    df1[,2*i] <- match(df1[,2*i],refs) 
    df1[,2*i+1] <- match(df1[,2*i+1],refs) 
} 

df1 
    IID L1.1 L1.2 L2.1 L2.2 
1 1 1 1 1 4 
2 2 2 4 2 5 
3 3 3 2 3 1 
4 4 4 5 4 3 
+1

안녕하세요! 내 DF를 행렬로 변환하면이 작업은 저에게 효과적입니다. 이 코드는 NA를 가능한 고유 식별자 중 하나로 변환하기 때문에 데이터에 NA가없는 문제가 있습니다. 내가 어떻게 설명 할 수 있는지 아십니까? 편집 : 할당 된 숫자가 너무 중요하지 않으므로 그 번호를 NA로 전환하십시오. 감사합니다. –

+0

또는'refs <--refs [! is.na (refs)]'행을 삽입하여'NA'를 그대로 유지할 수 있습니다. –

2

당신은 긴 형식으로 바꿀 그룹을 지정한 다음, 넓은에 개주 수 :

library(data.table) 

df_m <- melt(df, id.vars = "IID") 
setDT(df_m)[, id := .GRP, by = .(gsub("(.*).","\\1", df_m$variable), value)] 
dcast(df_m, IID ~ variable, value.var = "id") 

# IID L1.1 L1.2 L2.1 L2.2 
#1 1 1 1 6 9 
#2 2 2 4 7 10 
#3 3 3 2 8 6 
#4 4 1 5 9 8 

이 쉽게 확장해야한다 여러 컬럼 그룹으로 나는. 당신은 L3.이 있다면 그것도 잘 작동합니다.