2012-04-03 3 views
1

두 줄로 된 계층 구조의 열 이름이있는 크로스 탭으로 구성된 csv 파일을 가져 오려고합니다.여러 행에 걸쳐 열 이름?

alpha X.1 X.2 beta X.1 X.2 X.3 gamma X.1 
    var1 var2 var3 var1 var2 var3 var4 var1 var4 
1  21 50 5 22 48 6 8 25 8 
2  27 50 5 24 48 6 8 33 8 
3  26 50 5 28 48 6 8 33 8 
4  25 50 5 28 48 6 8 20 8 
여기

, 알파, betavar1var2var3var4이 두 번째 수준 동안 gamma는 계층 구조의 모든 한 수준이다 : 나는 R의 표를 얻을 때, 그 결과는 다음과 같습니다 .

내가하고 싶은 것은 행 이름이 연결되어 있지만 데이터 구조를 염두에두고 다음과 같은 출력을 얻는 것입니다.

alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_var1 gamma_var4 
1   21   50   5  22   48   6   8   25   8 
2   27   50   5  24   48   6   8   33   8 
3   26   50   5  28   48   6   8   33   8 
4   25   50   5  28   48   6   8   20   8 

여기에 아이디어가 있습니까? 이 문제를 해결할만한 것을 찾을 수 없었습니다. 미리 감사드립니다.

+0

... 파일은 어떻게 생겼습니까? – Tommy

+0

대답은'skip'과'nrows' 매개 변수를 이용하여'read.table()'을 두 번 호출하는 것과 관련이 있습니다. – Chase

+0

파일은 csv이며 X.1, X.2 등은 빈 셀을 나타냅니다. 데모 파일을 업로드하는 방법을 모릅니다. – user1202761

답변

1

xts의 사용은 기능이 다소 무거워 보일 지 모르지만 작동하는 것으로 알고 자주 사용하므로 그게 내가 사용했던 것입니다.

library(xts) 
#Read in data without headers 
x <- read.delim("Book1.txt", skip = 2, header = FALSE) 
#Read in header files transposing them into columns 
headers <- data.frame(t(read.delim("Book1.txt", nrows = 2, header = FALSE)), stringsAsFactors = FALSE) 

#Create a now column with the value of alpha, beta, gama or NA 
headers$vals <- with(headers, ifelse(grepl("[abg]", X1), X1, NA)) 
#Fill down the values above 
headers$vals <- na.locf(headers$vals) 
#Paste column names together 
colnames(x) <- with(headers, paste(vals, X2, sep = "_")) 
#Resulting object 
x 



alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_ var1 gamma_var4 
1   21   50   5  22  48   6   8   25   8 
2   27   50   5  24  48   6   8   33   8 
3   26   50   5  28  48   6   8   33   8 
4   25   50   5  28  48   6   8   20   8 
+0

고마워요,하지만 불행히도 난 열 이름의 집합에 유연한 솔루션을 찾고 있어요. grepl ("[a-z]"...)을 지정하여 모든 문자 집합에 대해 작동하도록 만들었지 만 가능한 경우 더 유연한 솔루션을 선호합니다. – user1202761

+0

@ user1202761 - 보관하려는 열과 저장하지 않을 열을 어떻게 구별 할 계획입니까? 보관하려는 열을 식별하기 위해 해당하는 정규 표현식을 찾는 것이 어렵지 않아야합니다. 대신 "X.1-9"패턴을 검색 할 수 있습니까? 이런 식으로 뭔가! '(grepl ("X \\. \\ d", x))'. 패턴 "X"를 찾고 있습니다. 그 다음에 숫자가 그 뒤를이었습니다. – Chase

+0

CSV에서 빈 헤더 셀을 가져올 때'X.1' 등이 자동으로 생성됩니다. 'header = FALSE'라고 말하면, 그들은 ''로 나타납니다. 또 다른 문제는 첫 번째와 두 번째 수준 모두에서 열이 ''이면 실패합니다. – user1202761

관련 문제