0

私はしばらくこの問題に悩まされてきました。助けが要る。次のファイル (3 ファイル以上のファイルになる可能性があります) をデータフレームに読み込んでいます。私の入力ファイルは次のようになります: file1:

someName    someMOD someID
A   T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P),S762(P) 1
B   S495(P) 2
C   S162(P),Q159(D) 3
D   S45(P),C47(C),S48(P),S26(P) 4
E   S18(P)  5

ファイル2:

someName    someMOD someID
C   S162(P),Q159(D) 3
D   S45(P),C47(C),S48(P),S26(P) 4
F   S182(P) 6
E   S18(P)  5
Z   Q100(P) 9
A   T754(P),M691(O),S694(P),S739(P),S740(P) 1

ファイル3:

someName    someMOD someID
A   T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P) 1
B   S495(P) 2
D   S45(P),C47(C),S48(P),S26(P) 4
E   S18(P)  5
F   S182(P) 6
L   Z182(P) 8
C   S162(P),Q159(D) 3

私のコード:

  fileList <- dir(pattern="*.xls")
  i<-1
  j<-1
  a<-list()
  mybigtable<-data.frame

  for (f in 1:length(fileList)){
    fileName <- fileList[f]
    X <-read.xls(fileName)
    if(regexpr("Drug_Rep", fileName)[1]>0){
      a[[i]]<-X
     }
      i=i+1
    }
    else{
        #Don't do anything
    }
  }

  #Now i want to merge my dataframes
  mymerge <- function(x, y)
    merge(x, y, by=c("someName", "someID"), all=TRUE))

  Reduce(mymerge,a) #passing my list of dataframes 'a'

「a」リストで dput() を実行しました。

list(structure(list(someName = structure(c(1L, 2L, 4L, 5L, 6L, 
7L, 3L), .Label = c("A", "B", "C", "D", "E", "F", "L"), class = "factor"), 
    someMOD = structure(c(6L, 5L, 4L, 2L, 3L, 7L, 1L), .Label = c("S162(P),Q159(D)", 
    "S18(P)", "S182(P)", "S45(P),C47(C),S48(P),S26(P)", "S495(P)", 
    "T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P)", 
    "Z182(P)"), class = "factor"), someID = c(1L, 2L, 4L, 5L, 
    6L, 8L, 3L)), .Names = c("someName", "someMOD", "someID"), class = "data.frame", row.names = c(NA, 
-7L)), structure(list(someName = structure(1:5, .Label = c("A", 
"B", "C", "D", "E"), class = "factor"), someMOD = structure(c(5L, 
4L, 1L, 3L, 2L), .Label = c("S162(P),Q159(D)", "S18(P)", "S45(P),C47(C),S48(P),S26(P)", 
"S495(P)", "T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P),S762(P)"
), class = "factor"), someID = 1:5), .Names = c("someName", "someMOD", 
"someID"), class = "data.frame", row.names = c(NA, -5L)), structure(list(
    someName = structure(c(2L, 3L, 5L, 4L, 6L, 1L), .Label = c("A", 
    "C", "D", "E", "F", "Z"), class = "factor"), someMOD = structure(c(2L, 
    5L, 4L, 3L, 1L, 6L), .Label = c("Q100(P)", "S162(P),Q159(D)", 
    "S18(P)", "S182(P)", "S45(P),C47(C),S48(P),S26(P)", "T754(P),M691(O),S694(P),S739(P),S740(P)"
    ), class = "factor"), someID = c(3L, 4L, 6L, 5L, 9L, 1L)), .Names = c("someName", 
"someMOD", "someID"), class = "data.frame", row.names = c(NA, 
-6L)))

リストにデータを入力する際の私の間違いは何ですか? どんな助けでも本当に感謝しています。次のような出力を取得しようとしています。

ここに画像の説明を入力

4

2 に答える 2

2

以前に提供したコードの問題は、重複する列名があり、3 つ以上のデータセットをマージするmergeと混乱することです。衝突しないように、列の名前を変更する必要があります。ループは、この目的のために何でも同様に機能します。someMODfor

dupvars <- which(!names(a[[1]]) %in% c("someName", "someID"))
for(i in seq_along(a))
    names(a[[i]])[dupvars] <- paste0(names(a[[i]])[dupvars], i)

# and then merge
Reduce(mymerge, a)
于 2013-06-23T10:43:56.267 に答える
1

mergeおそらく問題は、実際には標準的な意味でしようとしていないことですが、 reshape. この場合、「time」変数を追加した後にrbindすべてのs をまとめて、「reshape2」から使用して目的のものを取得できます。data.framedcast

「時間」変数とs を一緒rbindに追加しますdata.frame

temp <- do.call(rbind, 
                lapply(seq_along(a), 
                       function(x) data.frame(a[[x]], time = x)))
head(temp)
#   someName                                                 someMOD someID time
# 1        A T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P)      1    1
# 2        B                                                 S495(P)      2    1
# 3        D                             S45(P),C47(C),S48(P),S26(P)      4    1
# 4        E                                                  S18(P)      5    1
# 5        F                                                 S182(P)      6    1
# 6        L                                                 Z182(P)      8    1

data.frame「ロング」フォーマットから「ワイド」フォーマットに変換する

library(reshape2)
dcast(temp, someName + someID ~ time, value.var="someMOD")
#   someName someID                                                       1
# 1        A      1 T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P)
# 2        B      2                                                 S495(P)
# 3        C      3                                         S162(P),Q159(D)
# 4        D      4                             S45(P),C47(C),S48(P),S26(P)
# 5        E      5                                                  S18(P)
# 6        F      6                                                 S182(P)
# 7        L      8                                                 Z182(P)
# 8        Z      9                                                    <NA>
#                                                                 2
# 1 T754(P),M691(O),S692(P),S694(P),S739(P),S740(P),S759(P),S762(P)
# 2                                                         S495(P)
# 3                                                 S162(P),Q159(D)
# 4                                     S45(P),C47(C),S48(P),S26(P)
# 5                                                          S18(P)
# 6                                                            <NA>
# 7                                                            <NA>
# 8                                                            <NA>
#                                         3
# 1 T754(P),M691(O),S694(P),S739(P),S740(P)
# 2                                    <NA>
# 3                         S162(P),Q159(D)
# 4             S45(P),C47(C),S48(P),S26(P)
# 5                                  S18(P)
# 6                                 S182(P)
# 7                                    <NA>
# 8                                 Q100(P)
于 2013-06-23T06:42:50.253 に答える