2015-01-11 2 views
0

질문은 다음과 같습니다 : 우리는 데이터에 대한 비정상적인 형태의 csv 파일을 가지고 있습니다. R은 거대하고, 나는 확실히 짧은 해결책을 놓치고있다.데이터 프레임을 정규화하는 관용적 인 방법이 있습니까?

을 감안할 때 우리가 그것을 읽고 아래의 양식의 dataframe 얻을 파일 :

id  file topic proportion 
0 file1.txt  0  0.01 
1 file2.txt  0  0.01 
1 file2.txt  1  0.03 

우리가 일정을이 dataframe이 점을 변환 할 수있는 간단한 방법이 있나요

# id, file, topic, proportion, [topic, proportion]* 
0,file1.txt,0,0.01 
1,file2.txt,0,0.01,1,0.03 

을 열 수? 주제 - 비율 쌍의 수는 정의되지 않으며 매우 클 수 있습니다. 고맙습니다!

+0

귀하의 질문에 명확하지 않습니다. 데이터를 R로 읽는 중입니까? 또한, 당신은 행의 수가 아니라 행의 수가 일정하다는 것을 믿습니다. –

+0

그래, 필자는 파일을 읽고 열 수가 다른 데이터 프레임을 얻고이 데이터를 정규화하여 각 레코드를 분할하는 고정 된 수의 열을 얻고 싶습니다. –

답변

1

한 가지 방법이 있습니다. 나는 data.csv 파일로 저장 파일의 경로를 포함한다고 가정

library(plyr) 

df  = read.csv(data) 
names  = c("id","file","topic","proportion") 
extractDF = function(u) setNames(df[,c(1,2,u,u+1)], names) 

newDF = ldply(seq(3,length(df)-1,by=2), extractDF) 

newDF[complete.cases(newDF),] 

# id  file topic proportion 
#1 0 file1.txt  0  0.01 
#2 1 file2.txt  0  0.01 
#4 1 file2.txt  1  0.03 

데이터는 다음과 같다을 csv 형식으로 저장 :

# id, file, topic, proportion, [topic, proportion]* 
0,file1.txt,0,0.01 
1,file2.txt,0,0.01,1,0.03 
+0

이 코드를 제공해 주셔서 감사합니다. 말 그대로 행 인덱스를 설정하지 않는 일반화 된 솔루션이 있습니까? 다른 행 수와 다른 행을 가질 수 있다고 가정하십시오. –

+0

행 색인을 설정하지 않았지만 색인으로 열을 언급하지 않았습니다! 이 솔루션은 예제에서 언급 한대로 4 또는 6 개의 요소가있는 줄이 있으면 작동합니다. –

+0

그럼에도 불구하고 임의의 길이의 행을 처리하는 방법이 있습니까? –

0

당신은 내 "splitstackshape"패키지에서 merged.stack을 시도 할 수 있습니다. 이것이 당신의 시작 데이터입니다 가정하면

.... 당신이해야 할 단지 것

mydf <- read.table(
    text = "id, file, topic, proportion, topic, proportion 
0,file1.txt,0,0.01 
1,file2.txt,0,0.01,1,0.03", 
    header = TRUE, sep = ",", fill = TRUE) 
mydf 
# id  file topic proportion topic.1 proportion.1 
# 1 0 file1.txt  0  0.01  NA   NA 
# 2 1 file2.txt  0  0.01  1   0.03 

....

library(splitstackshape) 
merged.stack(mydf, var.stubs = c("topic", "proportion"), 
      sep = "var.stubs")[, .time_1 := NULL][] 
# id  file topic proportion 
# 1: 0 file1.txt  0  0.01 
# 2: 0 file1.txt NA   NA 
# 3: 1 file2.txt  0  0.01 
# 4: 1 file2.txt  1  0.03 

랩은 na.omit에서 전체 일을하지 않으려면 그 (것)들에서 NA 가치가있는 행.

na.omit(
    merged.stack(mydf, var.stubs = c("topic", "proportion"), 
       sep = "var.stubs")[, .time_1 := NULL]) 
# id  file topic proportion 
# 1: 0 file1.txt  0  0.01 
# 2: 1 file2.txt  0  0.01 
# 3: 1 file2.txt  1  0.03 
관련 문제