2013-05-06 2 views
0

저는 R에 대해 비교적 새로운 편입니다. 따라서 경험이 많은 사용자는 벡터 공간에서 명확하게 생각하지 않습니다. 그래서 같은 형식있어 데이터 프레임이 있습니다 R의 TSV에서 키 - 값 쌍을 파싱

   metric timestamp    value   tag1  tag2 tag3 tag4 tag5 tag6 tag7 tag8 tag9 tag10 
1 dummy.random.unif 1367848802 0.9936670064926147 host=localhost blah=foo NA NA NA NA NA NA NA NA 
2 dummy.random.unif 1367848822 0.19621700048446655 host=localhost blah=bar NA NA NA NA NA NA NA NA 
3 dummy.linear  1367848842    97.6 shmoo=whatever NA   NA NA NA NA NA NA NA NA 
4 dummy.random.unif 1367848862 0.3171229958534241 host=localhost blah=foo NA NA NA NA NA NA NA NA 
5 dummy.linear  1367848882    97.7 shmoo=whatever NA   NA NA NA NA NA NA NA NA 
6 dummy.random.unif 1367848902 0.2197140008211136 host=localhost blah=foo NA NA NA NA NA NA NA NA 

당신이 볼 수 있듯이

, 키 - 값 쌍을 포함 tag1:tag10 열. 항상 같은 키가 아니며 항상 같은 수의 키가있는 것은 아닙니다. 나는 소비를 위해 더 편리 이와 비슷한 더 많은 것을,이 데이터 프레임을 변환 할 :

   metric timestamp    value tag.host tag.blah tag.shmoo 
1 dummy.random.unif 1367848802 0.9936670064926147 localhost  foo  NA 
2 dummy.random.unif 1367848822 0.19621700048446655 localhost  bar  NA 
3 dummy.linear  1367848842    97.6   NA  NA whatever 
4 dummy.random.unif 1367848862 0.3171229958534241 localhost  foo  NA 
5 dummy.linear  1367848882    97.7   NA  NA whatever 
6 dummy.random.unif 1367848902 0.2197140008211136 localhost  foo whatever 

지금 내가 절차 적으로이 작업을 수행 할 수 있습니다 알고 있지만, 거추장스러운 것, 그리고 올바른 들었습니다 R을 사용하는 방법은 전체 벡터에 대한 연산을 생각하는 것입니다. do.call, daply, strsplit 등의 올바른 순열을 알아 내려고 몇 시간을 보냈지 만 어디에도 없습니다.

이 문제를 해결하기위한 깨끗한 R-ish 방법은 무엇입니까?

+0

좋은 재현성 예를 만드는 방법에 이것을 읽고 질문을 업데이트하십시오 : http://stackoverflow.com/questions/5963269/how-to-make-a- 위대한 -r-reproducible-example – Dason

+0

시도 sub 또는 str_split –

답변

3

DF 입력 된 데이터 프레임은 다음 바와 같이 전체로 melt를 이용하여 긴 형태로 넓은에서 변환 NA 행을 제거 tag.nametag.value에 태그를 분리하고 다시 바꿀 경우 :

library(reshape2) 
m <- na.omit(melt(DF, id = 1:3, value.name = "tag")) 
m.tr <- transform(m, tag.name = sub("=.*", "", tag), 
        tag.value = sub(".*=", "", tag)) 
dcast(metric + timestamp + metric + value ~ tag.name, data=m.tr, 
     value.var="tag.value") 

스왑 마지막 줄에 metrictimestamp이 있으면 타임 스탬프 순서대로 출력해야합니다. 마지막 줄의 결과는 다음과 같습니다

   metric timestamp  value blah  host shmoo 
1  dummy.linear 1367848842 97.600000 <NA>  <NA> whatever 
2  dummy.linear 1367848882 97.700000 <NA>  <NA> whatever 
3 dummy.random.unif 1367848802 0.993667 foo localhost  <NA> 
4 dummy.random.unif 1367848822 0.196217 bar localhost  <NA> 
5 dummy.random.unif 1367848862 0.317123 foo localhost  <NA> 
6 dummy.random.unif 1367848902 0.219714 foo localhost  <NA> 
+0

거룩한 쓰레기. 언젠가 내가 열심히 노력한다면 당신이 생각하는 것처럼이 사고 방식을 잘 지킬 수 있기를 바랍니다. 감사. – danslimmon

관련 문제