2017-04-24 14 views

답변

2

좋은 방법은 각 시트를 데이터 프레임 목록으로 읽어서 소스 시트 식별자를 포함하는 단일 데이터 프레임에 쌓은 다음 ggplot2를 사용하여 플롯하는 것입니다.

다음은 내가 만든 test.xlsx이라는 간단한 Excel 파일의 예입니다. 아래 그림과 같이 3 개의 시트에 4 개의 데이터 행이 있습니다. 코드는 Excel 파일이 현재 작업 디렉토리에 있다고 가정합니다. 그렇지 않은 경우 데이터를 읽을 때 파일에 적절한 경로를 제공하십시오. 나는 readxl 패키지를 사용하여 데이터를 읽었습니다. 이 방법은 동일한 열 이름을 가진 시트를 여러 개 포함하는 Excel 통합 문서로 일반화합니다 (다른 시트의 다른 열 이름을 처리하기 위해 추가 처리를 할 수는 있지만).

library(readxl) 
library(dplyr) 
library(ggplot2) 

# Get sheet names 
sht = excel_sheets("test.xlsx") 

sht 
[1] "Sheet 3" "Sheet 2" "Sheet1" 
# Read each sheet into a list 
df = lapply(setNames(sht, sht), function(s) read_excel("test.xlsx", sheet=s)) 

df 
$`Sheet 3` 
     x  y 
1  1 10 
2  2 11 
3  3 12 
4  4 13 

$`Sheet 2` 
     x  y 
1  1  5 
2  2  6 
3  3  7 
4  4  8 

$Sheet1 
     x  y 
1  1  1 
2  2  2 
3  3  3 
4  4  4 
를 사용하는
# Convert to a single data frame with a column for the source sheet 
df = bind_rows(df, .id="Sheet") 

# Plot 
ggplot(df, aes(x,y,colour=Sheet)) + 
    geom_line() + 
    scale_y_continuous(limits=c(0,max(df$y))) + 
    theme_classic() 

enter image description here

+0

완벽! 많이 감사합니다! – futong

2

는 또 다른 방법이 될 수있다에는 통합 문서에있는 이름과 시트 수를 알려주는 getSheets이라는 기능이 있습니다. 나는 시트의 이름을 읽고 모든 시트의 데이터 목록을 만들기 위해 시트의 이름을 사용하고 있습니다. 나중에 ggplot과 함께 사용하기 위해 이러한 데이터를 긴 형식으로 결합합니다. 예를 들어

library(xlsx) 
setwd("/Users/pradeepkumar/Desktop/Misc") ###set your working directory where your data resides 
sheetname <- getSheets(loadWorkbook("Workbook1.xlsx")) 
s1 <- lapply(names(sheetname),function(x)read.xlsx("Workbook1.xlsx",sheetName = x)) 
names(s1) <- names(sheetname) 
final_data <- data.frame(do.call("rbind",s1)) 
sheets <- rownames(final_data) 
sheets <- gsub("\\.\\d{1,}","",sheets) 
final_data$sheets <- sheets 
rownames(final_data) <- NULL 
library(ggplot2) 
ggplot(data=final_data,aes(x=x,y=y,color=sheets)) + geom_line() 

난 세 개의 시트 (1, 2, 3)

I 세 가지 X와 그들 각각의 데이터 세트와 변수와 Y가 함께 통합 (Workbook1.xlsx)를 갖는다. 위의 코드를 사용하여 아래 그림과 같은 플롯을 얻을 수 있습니다.

enter image description here

+1

정말 고마워요! – futong

+0

@futong 안녕하십니까. 당신이 거의 새로운 것 같지 않습니다. 당신이 솔루션을 게시 한 첫 번째 사람이었던 것처럼, 제 솔루션에 동의 응답을 실수로 다시 선택했을 수도 있습니다. 그러나 나는 당신이 eipi10 솔루션을 받아들이도록 요청합니다. 당신의 낮은 점수 때문에 내 대답에 업 보봇 (upvote)을 할 수는 없다는 것을 이해하지만, 감사는 나를 위해 충분하다. epi10으로 표시된 솔루션을 변경하십시오. 그것은 위대한 공동체입니다. 감사합니다. – PKumar

+2

사실, @ 푸통이 먼저 일어난 대답이 아니라 그에게 가장 적합한 대답을 선택하는 것이 더 낫다고 생각합니다. 'xlsx'를 사용하여 자신의 워크 플로우에 더 잘 맞는다면, 그는 대답을 선택해야합니다. – eipi10