0

作業ディレクトリの各ファイルから特定のセルを使用して新しいデータフレームを作成できるかどうか疑問に思っています。たとえば、次のような 2 つのデータ フレームがあるとします (数字はランダムなので無視してください)。

ここに画像の説明を入力

各データセットで、行 4 は値の合計で、行 5 は欠損値の数です。欠損値の数を「M」、列の合計を「N」として表す場合、達成しようとしているのは次の表です。

ここに画像の説明を入力

したがって、各ファイル '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)

これが可能かどうか、またどのようにアプローチすればよいかについて、何か提案をいただければ幸いです。

どうもありがとう、
アヤン

4

2 に答える 2

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

(少しトリッキー/珍しいビットは、 の 3 行目にあり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
于 2012-04-04T13:39:01.047 に答える
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

これにより、次の結果が得られます。

  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
于 2012-04-04T13:56:45.857 に答える