R과 병합된 Excel 셀을 읽는 방법
병합된 셀이 포함된 엑셀 시트 수백 장을 받았습니다.보낸 사람은 엑셀을 사용하고 셀을 병합해야 한다고 주장합니다. 제가 할 수 있는 것은 아무것도 없습니다.R을 사용하여 이것들을 어떻게 읽습니까?예를 들어, 입력 시트의 문제 영역의 단순화된 버전은 병합된 셀(B2,B3,C2,C3)에 "X"라는 단어가 포함된 경우와 같이 보일 수 있습니다.병합된 셀 수와 시트의 위치(및 "X" 값)는 시트마다 변경되며, 동일한 시트에 병합된 셀 집합이 둘 이상 있을 수 있습니다.시트는 실제로 표 형식이 아니며 다른 빈 셀을 포함합니다.저는 성공적으로 모든 파일을 루프하고, 모든 난장판을 정리하고, 결과를 재구성하고, 깔끔한 데이터 세트(Excel 워크북 736개 대신 1장)를 얻었습니다.문제는 지금까지 제 솔루션이 병합된 셀의 정보를 무시한다는 것입니다.
A B C D
1 a f i l
2 b X m
3 c n
4 d g j o
5 e h k p
어떻게 하면 Excel 시트를 R로 읽어 결과가 "X"라는 단어로 이렇게 나타나도록 할 수 있습니까?
A B C D
1 a f i l
2 b X X m
3 c X X n
4 d g j o
5 e h k p
library(openxlsx)
data <- read.xlsx(xlsxFile = "Your path", fillMergedCells = TRUE, colNames = FALSE)
병합된 셀 채우기 = TRUE
이거 먹어봐요.
VBA/R 하이브리드가 사용자의 목적에 적합하면 워크시트의 모든 셀을 병합 해제하는 동시에 병합되지 않은 영역의 모든 셀을 해당 값으로 채우는 VBA 매크로가 있습니다.
Sub UnMerge(ws As Worksheet)
Dim R As Range, c As Range
Dim v As Variant
For Each c In ws.UsedRange
If c.MergeCells Then
v = c.Value
Set R = c.MergeArea
R.UnMerge
R.Value = v
End If
Next c
End Sub
간단한 테스트를 통해 어떻게 부르는지 알 수 있습니다.
Sub test()
UnMerge Sheets(1)
End Sub
서브UnMerged
예를 들어 전체적으로 반복되는 더 큰 프로그램의 일부로 사용할 수 있습니다..xlsx
폴더에 있는 파일과 파일에 있는 모든 데이터가 들어 있는 시트를 병합하여 .csv 파일로 저장합니다.
편집 중.기본 VBA 파일 처리는 다소 귀찮습니다.여러 파일을 반복해야 할 경우 관련 스크립트 언어 VBScript를 사용하는 경향이 있습니다.가상 윈도우즈에서 VBScript를 처리할 수 있는지 잘 모르겠습니다.VBScript는 Windows OS의 표준 부분이기 때문에 그렇게 생각합니다.이 경우 안전을 위해 파일을 백업한 후 다음이 작동하는지 확인합니다.를 사용하여 코드를 단순 텍스트 파일로 저장합니다..vbs
수정할 Excel 파일이 들어 있는 폴더의 확장자입니다.그런 다음 해당 아이콘을 클릭합니다.그것은 전체적으로 반복될 것입니다..xlx
그리고..xlsx
각 파일에 스크립트와 병합 시트 1이 들어 있는 디렉터리의 파일입니다.광범위하게 테스트하지 않았고 오류 처리 기능이 포함되지 않았지만 각각 여러 병합 영역이 포함된 3개의 Excel 파일이 있는 폴더에서 테스트했습니다. Windows 컴퓨터에서 예상대로 실행되었습니다.Mac에서 작동할지 모르겠습니다.
Option Explicit
Dim fso,fol,f,xl, wb, ws,ext,v,r,c
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set xl = CreateObject("Excel.Application")
xl.DisplayAlerts = False
xl.ScreenUpdating = False
set fol = fso.GetFolder(fso.GetParentFolderName(WScript.ScriptFullName))
For Each f In fol.Files
ext = LCase(fso.GetExtensionName(f.Name))
If ext = "xls" Or ext = "xlsx" Then
Set wb = xl.Workbooks.Open(f.Path)
Set ws = wb.Sheets(1)
For Each c In ws.UsedRange
If c.MergeCells Then
v = c.Value
Set R = c.MergeArea
R.UnMerge
R.Value = v
End If
Next
wb.Save
wb.Close
End If
Next
이 솔루션은 스프레드시트에 병합된 영역이 하나뿐이며 유일한 결측값(NA)이 병합된 셀 때문이라고 가정합니다.
코드:
library("openxlsx")
data = read.xlsx(xlsxFile = "Book1.xlsx", colNames = F)
cl = min(ceiling(which(is.na(data))/dim(data)[1]))
rw = min(which(is.na(data))%%dim(data)[1])
data[is.na(data)] = data[rw,cl]
예:
병합된 셀이 있는 Excel에서 읽은 데이터:
X1 X2 X3 X4 X5
1 1 a q a 11
2 2 b w s 22
3 3 c e d 33
4 4 d <NA> <NA> 44
5 5 <NA> <NA> <NA> 55
6 6 <NA> <NA> <NA> 66
7 7 g u j 77
8 8 h i k 88
9 9 i o l 99
10 10 j p m 110
보시는 바와 같이, "d"는 4행에서 6행, 2행에서 4행으로 병합되었습니다.병합된 셀 때문에 NA만 발생합니다.
인 제된코로터부드에서,cl
그리고.rw
병합된 값 "d"의 열과 행을 찾습니다.
마지막 줄은 모든 NA를 찾아 "d"로 대체합니다.
결과:
X1 X2 X3 X4 X5
1 1 a q a 11
2 2 b w s 22
3 3 c e d 33
4 4 d d d 44
5 5 d d d 55
6 6 d d d 66
7 7 g u j 77
8 8 h i k 88
9 9 i o l 99
10 10 j p m 110
참고: Thecolnames = F
Excel 데이터에 열 이름이 있는 경우 제거해야 합니다.
에서 탭 후 Excel로 .R
as.is = TRUE
) 및 공백을 X로 바꿉니다.예제의 마지막 줄은 Roland의 답변에 따라 모든 문자 열을 분석에 더 적합한 요인으로 변환합니다.
tab <- read.table("yourExcelAsText.txt", sep="\t", header=TRUE, as.is=TRUE)
tab[tab==""] <- "X"
tab <- as.data.frame(unclass(tab))
당신은 사건별로 해결해야 합니다.아래 코드는 당신이 인용한 것과 같은 사례를 해결합니다.하나 더 추가했습니다.을 파을다로저로 합니다.csv
또는 xlxs로 읽습니다.이 기능은 다음과 같습니다.for
속도를 위해 쉽게 벡터화할 수 있습니다.
da=read.table("testtemp.csv",sep=";",na.strings=c("", "NA"),stringsAsFactors = F)
#str(da)
#add more cases
da[5,1]<-da[5,2]<-da[4,2]<-NA
da
> da
V1 V2 V3 V4
1 q f i l
2 b x <NA> m
3 c <NA> <NA> n
4 d <NA> j o
5 <NA> <NA> k p
#function to find cases
cencell=function(da){ #i=2;j=2
fc=data.frame(matrix(NA,nrow(da)-1,3))
ij=1
for (i in 1:(ncol(da)-1))
for (j in 1:(nrow(da)-1)){
cst=c(da[j,i+1],da[j+1,i+1],da[j+1,i])
if(all(is.na(cst))){fc[ij,1:2]<-c(j,i)
fc[ij,3]<-da[j,i]
ij<-1+ij}
}
fc[1:(ij-1),]
}
(ctc=cencell(da))
#replace cases
daf=da #i=1
for(i in 1:nrow(ctc)){daf[ctc[i,1]+1,ctc[i,2]]<-ctc[i,3]
daf[ctc[i,1]:(ctc[i,1]+1),ctc[i,2]+1]<-ctc[i,3]
}
daf
> daf
V1 V2 V3 V4
1 q f i l
2 b x x m
3 c x x n
4 d d j o
5 d d k p
언급URL : https://stackoverflow.com/questions/37509886/how-to-read-merged-excel-cells-with-r
'programing' 카테고리의 다른 글
AsQueryable 메서드를 MongoDb C# Driver 2.1과 비동기적으로 사용하려면 어떻게 해야 합니까? (0) | 2023.07.02 |
---|---|
플라이웨이를 실행하는 방법: SpringBoot 앱에서 마이그레이션 전 청소? (0) | 2023.06.27 |
ORA-00988: 암호가 없거나 잘못되었습니다. (0) | 2023.06.27 |
보낸 사람 ID에 대한 FCM 토큰을 검색하기 전에 APNS 장치 토큰이 설정되지 않음 - 기본 Firebase 응답 (0) | 2023.06.27 |
데이터 테이블에서 빈 행을 제거하는 방법 (0) | 2023.06.27 |