2012-04-04 6 views
0

作業ディレクトリから各ファイルの特定のセルで新しいデータフレームを作成できるかどうかは疑問です。複数のCSVファイルから特定のセルを抽出して1つのテーブルを作成する方法

enter image description here

セイは、各データセットには、4行目は、私の値の合計であり、5行目は、数ある:例えば私はこのような2つのデータフレームを使用している場合は(彼らはランダムであるとして数字を無視してください)と言います値がありません。私はacheiveしようとしているものを「N」としてcoloumnsの「M」とサムは、次の表であるように私は、欠損値の数を表す場合:

enter image description here

ので、各ファイルを「N」と「M」 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だろう、この可能な場合、どのように私がすべき程度approch?

多くのおかげで、

+0

が見えます。しかし、私に聞かせてください:あなたのソースファイルは大きいですか?そうであれば、 'read.table'を見てください。これはファイル全体ではなく、あなたが望む行だけを読み込ませることになります。 –

答えて

1


アヤンこれは動作するはずです:

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 

(1ややトリッキー/珍しいビットはprocessFile()の3行目に来るここにあなたが見るのを助ける必要があるコードスニペットがあります。どのようにそれが達成されるか)。

(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つのラインに多くのアイデアを詰め込んだことに気付きましたが、それを少し拡大することが役に立ちそうです。 –

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

こんにちは、あなたの答えと私を助けてくれてありがとう。もう1つの答えは、実際に私のデータセットをsutesもっとあなたの返信のために感謝:) – Achak

関連する問題