2012-08-01 4 views
2

문제점이 이미 논의 된 경우 이전 게시를 점검하더라도 문제가 있으며 사과드립니다.R 열에 다양한 길이의 data.frame을 결합하십시오.

두 개의 열이있는 data.frame이 있는데 두 번째 열에는 여러 개의 식별자가 포함될 수 있지만 그 수는 다를 수 있습니다. 또 다른 data.frame에서 식별자는 다른 식별자와 일치합니다. 내가하고 싶은 무엇

df.1 

color identifier 
blue A1, B2, C3, C4 
yellow B2, C4, C6 
green A3 

df.2 

A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot  

이 같은 data.frame입니다 :

df.3 

color identifier  identifier2 
blue A1, B2, C3, C4 Mercedes, Porsche, Toyota, Hundai 
yellow B2, C4, C6  Porsche, Hundai, Peugeot 
green A3    BMW 

추가로 식별자와 두 번째 data.frame의 식별자를 포함하는 data.frame.

적용 및 스택 및 스택 해제를 사용하려고했지만 완전히 성공하지 못했습니다.

의견이 있으십니까?

답변

2

다른 해결책은 다음과 같습니다. strsplit : identifieridentifier1 이제 data.frame목록 것을

# The data 
df.1 = read.table(header=TRUE, text=" 
color identifier 
blue 'A1, B2, C3, C4' 
yellow 'B2, C4, C6' 
green 'A3'", stringsAsFactors = FALSE) 

df.2 = read.table(header=FALSE, text=" 
A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot", stringsAsFactors=FALSE) 
names(df.2) = c("identifier", "car") 

df.1$identifier = strsplit(df.1$identifier, split=", ") 
df.1$identifier1 = lapply(1:nrow(df.1), 
     function(x) df.2[which(df.2$identifier %in% df.1$identifier[[x]]), 2]) 
df.1 
# color  identifier      identifier1 
# 1 blue A1, B2, C3, C4 Mercedes, Porsche, Toyota, Hundai 
# 2 yellow  B2, C4, C6   Porsche, Hundai, Peugeot 
# 3 green    A3        BMW 

참고. 개인적으로 나중에이 작업을 더 쉽게 수행 할 수 있습니다.

str(df.1) 
# 'data.frame': 3 obs. of 3 variables: 
# $ color  : chr "blue" "yellow" "green" 
# $ identifier :List of 3 
# ..$ : chr "A1" "B2" "C3" "C4" 
# ..$ : chr "B2" "C4" "C6" 
# ..$ : chr "A3" 
# $ identifier1:List of 3 
# ..$ : chr "Mercedes" "Porsche" "Toyota" "Hundai" 
# ..$ : chr "Porsche" "Hundai" "Peugeot" 
# ..$ : chr "BMW" 

당신은 남은 공백이있는 경우 strsplit을 수정해야 할 수도 있지만,이 샘플 데이터로 사용할 수 있습니다. 또한 strsplit이 작동하려면 데이터가 as.character이어야합니다 (따라서 데이터를 읽을 때 stringsAsFactors을 사용합니다).

업데이트 :을

write.table는() 나는 추가 분석을하고 싶었다 경우 목록에 데이터를 유지하는 것을 선호합니다. 데이터가 완전하거나 출력을 목적으로하는 경우에는,이 같은 일을 수행 할 수 있습니다 :

df.3 = df.1 
df.3$identifier = sapply(df.3$identifier, paste0, collapse=", ") 
df.3$identifier1 = sapply(df.3$identifier1, paste0, collapse=", ") 

이 지금 모드 character 대신 list의 당신이 identifieridentifier1 이후 write.table을 사용하는 수 있습니다.

+0

감사합니다, mrdwab,이 솔루션은 완벽하게 작동했습니다. –

+0

그러나 data.frame의 목록으로 작업하는 것이 정말 쉽습니다. 예 :테이블을 작성하려고하면 오류 메시지가 표시됩니다. –

+0

@ R.newbie, 내 업데이트 참조. – A5C1D2H2I1M1N2O1R2T1

1

아마도 가장 쉬운 방법은 gsub이라는 정규 표현식을 사용하여 대체 할 수 있습니다.

데이터를 재 작성 :

df1 <- read.table(text=" 
color identifier 
blue 'A1, B2, C3, C4' 
yellow 'B2, C4, C6' 
green A3 
", header=TRUE) 


df2 <- read.table(text=" 
A1 Mercedes 
A3 BMW 
B2 Porsche 
C3 Toyota 
C4 Hundai 
C5 Volkswagen 
C6 Peugeot 
", header=FALSE) 

을 그리고 지금 당신은 당신의 색상 검색 (df2)의 각 요소를 통해 루프 가지고 df1에서 교체합니다

for (i in seq_len(nrow(df2))){ 
    df1$identifier <- gsub(df2[i, 1], df2[i, 2], df1$identifier) 
} 

결과 :

df1 
    color      identifier 
1 blue Mercedes, Porsche, Toyota, Hundai 
2 yellow   Porsche, Hundai, Peugeot 
3 green        BMW 
+0

귀하의 제안에 대해 Andrie에게 감사드립니다. –

관련 문제