2012-04-04 4 views
0

작업 디렉토리의 각 파일에서 특정 셀을 사용하여 새 데이터 프레임을 만들 수 있는지 궁금합니다.여러 CSV 파일에서 특정 셀을 추출하여 단일 테이블을 만드는 방법

enter image description here

말 각 데이터 세트에서 4 행 내 값의 합이며, 행 5의 숫자입니다 : 예를 들어 나는이 같은 2 데이터 프레임이있는 경우 (그들은 무작위로 숫자를 무시하십시오)라고 누락 된 값.

enter image description here

그래서 각 파일 'N'과 'M': 나는 "M"과 "N", 등 coloumns의 합계로 누락 된 값의 수를 나타냅니다 경우 제가 acheive하려고하면 다음 표입니다 1 행에 있습니다.

디렉토리에 파일이 너무 많아서 목록에서 읽을 수 있지만 파일 목록에서 이러한 작업을 수행하는 가장 좋은 방법은 무엇인지 모릅니다.

이 내가 보여 테이블에 대한 내 샘플 코드와 나는이 목록에 읽기 방법 : 당신이 나에게 어떤 제안을 줄 수 있다면

##Create sample data 

df = data.frame(Type = 'wind', v1=c(1,2,3,100,50), v2=c(4,5,6,200,60), v3=c(6,7,8,300,70)) 
df2 =data.frame(Type = 'test', v1=c(3,2,1,400,40), v2=c(2,3,4,500,30), v3=c(6,7,8,600,20)) 

# write to directory 
write.csv(df, file = "sample1.csv", row.names = F) 
write.csv(df2, file = "sample2.csv", row.names = F) 

# read to list 
mycsv = dir(pattern=".csv") 
n <- length(mycsv) 

mylist <- vector("list", n) 
for(i in 1:n) mylist[[i]] <- read.csv(mycsv[i],header = TRUE) 

은 정말 greatful 것이 가능한 경우와 어떻게해야에 대한 승인?

많은 감사,

+0

보인다. 하지만 물어 봅시다 : 당신의 소스 파일이 큽니까? 그럴 경우 전체 파일이 아닌 원하는 행만로드 할 수있게 해주는'read.table'을 살펴보십시오. –

답변

1


Ayan이 작동합니다 :

processFile <- function(File) { 
    d <- read.csv(File, skip = 4, nrows = 2, header = FALSE, 
        stringsAsFactors = FALSE) 
    dd <- data.frame(d[1,1], t(unlist(d[-1]))) 
    names(dd) <- c("ID", "v1N", "V1M", "v2N", "V2M", "v3N", "V3M") 
    return(dd) 
} 

ll <- lapply(mycsv, processFile) 
do.call(rbind, ll) 
#  ID v1N V1M v2N V2M v3N V3M 
# 1 wind 100 50 200 60 300 70 
# 2 test 400 40 500 30 600 20 

(한 약간 까다로운/특이한 비트 processFile()의 세 번째 줄에 제공 여기에 당신이 볼 수 있도록해야 코드 조각입니다. 어떤 일을 성취하는지)

(d <- data.frame(a="wind", b=1:2, c=3:4)) 
#  a b c 
# 1 wind 1 3 
# 2 wind 2 4 
t(unlist(d[-1])) 
#  b1 b2 c1 c2 
# [1,] 1 2 3 4 
+0

나는 포스터가 원하는 것을 완전히 이해하지 못한다고 생각합니다. 이것은 내 답변보다 더 적절하다고 본다. –

+0

답장을 보내 주셔서 감사합니다. 정확히 내가 찾고 있었던 것이 었습니다! t (unlist (d [-1])) 코드에 대한 명확한 설명을 주셔서 감사합니다. 다시 실제 데이터 세트를 처리하는 방법을 이해하는 것이 매우 유용했습니다.)) – Achak

+0

기쁜 추가 설명이 도움이되었습니다. 저는 한 줄로 많은 아이디어를 모으고 조금 더 확장하면 도움이되기를 바랍니다. –

1

경고 : 내가 원하는 것을 완전히 이해하고 있는지 잘 모르겠다. 난 당신이 목록에서 읽고 그 목록에서 동일한 행과 함께 그 목록에서 특정 데이터 프레임을 선택하려는 생각합니다. 그런 다음 해당 행의 데이터 프레임을 만들고 긴 형식에서 넓은 형식으로 변환하려고합니다.

LIST <- lapply(2:3, function(i) { 
     x <- mylist[[i]][4:5, ] 
     x <- data.frame(x, row = factor(rownames(x))) 
     return(x) 
    } 
) 

DF <- do.call("rbind", LIST) #lets you bind an unknown number of rows from a list 
levels(DF$row) <- list(M =4, N = 5) #recodes rows 4 and 5 with M and N 

wide <- reshape(DF, v.names=c("v1", "v2", "v3"), idvar=c("Type"), 
    timevar="row", direction="wide") #reshape from long to wide 

rownames(wide) <- 1:nrow(wide) #give proper row names 
wide 

이 수율 : 당신은`lapply`와`for` 루프를 대체 할 수처럼

Type v1.M v2.M v3.M v1.N v2.N v3.N 
1 wind 100 200 300 50 60 70 
2 test 400 500 600 40 30 20 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 다른 대답은 내 dataset 실제로 더 sutes하지만 귀하의 회신에 다시 한번 감사드립니다 :) – Achak

관련 문제