2014-12-05 4 views
1

넓은 데이터를 긴 형식으로 변환하는 방법을 찾는 데 어려움이 있습니다. 나는 하나의 열 (WordCountRegion)과 같은 방법으로 각 주물과 항목에 대해 올바른 단어가이 세 열 중 하나에서 매핑된다는 문자열 데이터 (A1_R00_FillerNP, A1_R01_ADVA1_R02_1stEmbV)의 3 개 열을 가지고 있습니다. 새로운 WordCountRegionmelt()를 사용하여 값 조회가 필요한 와이드에서로 데이터 형식 변환

: 아래의 코드와 같이 간단한 melt 방법을 사용

나에게이 길의 일부 얻는다 (참고하십시오 df에서 이상한 문자가 하찮은이다 - 여기를 무시하십시오)

df <- structure(list(Subject = c(101L, 101L, 101L, 101L, 101L, 101L, 
101L, 101L, 101L, 101L, 101L, 101L, 101L, 101L, 101L, 101L, 101L, 
101L), condition = structure(c(2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 
3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L), .Label = c("P", "R", 
"S"), class = "factor"), item = c(101L, 102L, 103L, 101L, 102L, 
103L, 101L, 102L, 103L, 101L, 102L, 103L, 101L, 102L, 103L, 101L, 
102L, 103L), A1_R00_FillerNP = structure(c(3L, 2L, 1L, 3L, 2L, 
1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L), .Label = c("SÌÇna d_r allvarliga konsekvenser", 
"SÌÇna d_r fina _ppeltr_d", "SÌÇna d_r gamla skottk_rror" 
), class = "factor"), A1_R01_ADV = structure(c(1L, 1L, 2L, 1L, 
1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L), .Label = c("alltid", 
"f_rresten"), class = "factor"), A1_R02_1stEmbV = structure(c(3L, 
2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 
1L), .Label = c("diskuterade", "stod", "tv_ttade"), class = "factor"), 
    RT = c(0L, 149L, 247L, 272L, 171L, 245L, 317L, 0L, 233L, 
    0L, 981L, 750L, 272L, 171L, 334L, 317L, 0L, 233L), Region = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
    3L, 3L), .Label = c("R00", "R01", "R02"), class = "factor"), 
    RegionType = structure(c(3L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 
    1L, 3L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("1stEmbV", 
    "ADV", "FillerNP"), class = "factor"), DV = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("FIRST_FIXATION_DURATION", "GAZE_DURATION" 
    ), class = "factor")), .Names = c("Subject", "condition", 
"item", "A1_R00_FillerNP", "A1_R01_ADV", "A1_R02_1stEmbV", "RT", 
"Region", "RegionType", "DV"), class = "data.frame", row.names = c(NA, 
-18L)) 

df1 = melt(df, measure.vars = c("A1_R00_FillerNP","A1_R01_ADV","A1_R02_1stEmbV"), var = "WordCountRegion") 

문제는이 코드가 여러 지역의 단어를 잘못 분리한다는 것입니다. 나는 단어가 Region에 의해 지정된대로 깨지지 않고 WordCountRegionvalue에서 볼 수있는 것처럼 Region의 값을 가로 질러 확장하는 다음과 같은 출력으로 끝납니다. 이걸 사용하려고한다면 melt()가 데이터를 올바르게 깨뜨릴 수 있도록 일종의 추가 사양이 필요하다는 것은 분명합니다. 나는 이것을 (또는 용융() 내에서 할 수 있다면) 어떻게해야할지 모르겠다.

Subject condition item RT Region RegionType      DV WordCountRegion        value 
1  101   R 101 0 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
2  101   P 102 149 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
3  101   S 103 247 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
4  101   R 101 272 R01  ADV FIRST_FIXATION_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
5  101   P 102 171 R01  ADV FIRST_FIXATION_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
6  101   S 103 245 R01  ADV FIRST_FIXATION_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
7  101   R 101 317 R02 1stEmbV FIRST_FIXATION_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
8  101   P 102 0 R02 1stEmbV FIRST_FIXATION_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
9  101   S 103 233 R02 1stEmbV FIRST_FIXATION_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
10  101   R 101 0 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
11  101   P 102 981 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
12  101   S 103 750 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
13  101   R 101 272 R01  ADV   GAZE_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
14  101   P 102 171 R01  ADV   GAZE_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
15  101   S 103 334 R01  ADV   GAZE_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
16  101   R 101 317 R02 1stEmbV   GAZE_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
17  101   P 102 0 R02 1stEmbV   GAZE_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
18  101   S 103 233 R02 1stEmbV   GAZE_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
19  101   R 101 0 R00 FillerNP FIRST_FIXATION_DURATION  A1_R01_ADV       alltid 
20  101   P 102 149 R00 FillerNP FIRST_FIXATION_DURATION  A1_R01_ADV       alltid 
21  101   S 103 247 R00 FillerNP FIRST_FIXATION_DURATION  A1_R01_ADV       f_rresten 

인가가 나는 아래의 샘플로, Region에 의해/일치하는 줄을이를 얻을 수 melt()을 수정할 수있는 방법 : 나는 완전히 잘못된 기능을 사용하고있는 경우,

Subject condition item RT Region RegionType      DV WordCountRegion        value 
1  101   R 101 0 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
2  101   P 102 149 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
3  101   S 103 247 R00 FillerNP FIRST_FIXATION_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 
4  101   R 101 272 R01  ADV FIRST_FIXATION_DURATION A1_R01_ADV         alltid 
5  101   P 102 171 R01  ADV FIRST_FIXATION_DURATION A1_R01_ADV         alltid 
6  101   S 103 245 R01  ADV FIRST_FIXATION_DURATION A1_R01_ADV        f_rresten 
7  101   R 101 317 R02 1stEmbV FIRST_FIXATION_DURATION A1_R02_1stEmbV       tv_ttade 
8  101   P 102 0 R02 1stEmbV FIRST_FIXATION_DURATION A1_R02_1stEmbV        stod 
9  101   S 103 233 R02 1stEmbV FIRST_FIXATION_DURATION A1_R02_1stEmbV      diskuterade 
10  101   R 101 0 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP  SÌÇna d_r gamla skottk_rror 
11  101   P 102 981 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP   SÌÇna d_r fina _ppeltr_d 
12  101   S 103 750 R00 FillerNP   GAZE_DURATION A1_R00_FillerNP SÌÇna d_r allvarliga konsekvenser 

또는 , 누군가 더 나은 해결책을 향해 나를 가리킬 수 있었습니까? 아마도 실제 조회를 수행하는 무언가가 필요합니까?

+1

코드 스 니펫에 배치 등으로 인해 묻는 것을 정확하게 따라 가기가 어렵습니다. 지역지도를 스태킹중인 세 개의 열로 매핑하는 방법을 어떻게 녹여야하나요? 문제는 df1에서 얻은 결과에 지역 라벨이 잘못 붙어 있다는 것입니까? 그렇다면 WordCountRegion의 값에서 R00, R01 등을 찾아 녹은 데이터 프레임에서 영역을 재현 할 수 있습니까? – eamcvey

+0

안녕하세요. 일부 서식을 변경하고 문제를보다 명확하게 수정하기 위해 편집했습니다. 아마 당신이 말했듯이, 휴식이 어디에서 일어나야 하는지를 알아야하기 때문에 melt()를 사용하는 것이 가능하지 않을 수도 있습니다. 더 잘 작동 할 수있는 조회 기능이 있습니까? –

+0

'WordCountRegion'의 영역이'Region'과 일치 할 때 행만 유지하도록 데이터 집합을 필터링 한 후 필터링 할 수 있습니다. 'WordCountRegion'이 항상 문자열의 요소 4-6에 지역 코드를 가지고 있다면'subset (df1, Region == substr (WordCountRegion, 4, 6))'입니다. 또는'subset (df1, Region == gsub ("^. * (R [0-9] +). * $", "\\ 1", WordCountRegion))'와 같은 것입니다. – aosmith

답변

1

약간의 찾아보기 테이블을 만들고 병합 한 다음 녹아있는 데이터 프레임을 필터링하는 데 사용할 수 있습니다. 그러면 원하는 결과가 나타납니다.

region_df <- data.frame(var = c("A1_R00_FillerNP","A1_R01_ADV","A1_R02_1stEmbV"), 
    Region = c('R00','R01','R02')) 

df2 <- merge(df1, region_df) 
df3 <- subset(df2, var==WordCountRegion) 
+0

이것은 완벽하게 작동하는 것 같다. 그리고 그것은 다른 크기의 var 이름을 허용합니다 (실제로 전체 데이터 세트의 경우). 나는 원래의 (과장된) 코드가 데이터의 정확한 서브 세트 (사전 필터링)와 얼마나 정확하게 일치하는지에 대해 여전히 주저하고있다.그러나 올바른 값으로 알려진 필터링 된 데이터에서 두 개의 주제에 대해 두 개의 영역을 확인했는데 아무런 문제도 보지 않았습니다. 도움을 주신 모든 분들께 감사드립니다. –