2

与えられた 2 つのデータ フレーム

old.df = data.frame(SampleNo=c('A1', 'B4', 'C5', 'D4'), Result=c(rep("Successful",4)), NoUnit = c(rep(4,4)))
new.df = data.frame(SampleNo=c('A1', 'C5', 'D4', 'E4'), Result=c(rep("Successful",2),rep( "Failure",2)),State=c(rep("California",2),rep("New York",2)))

次の形式になります。

> old.df
  SampleNo     Result      NoUnit
1       A1     Successful      4
2       B4     Successful      4
3       C5     Successful      4
4       D4     Successful      4


> new.df
  SampleNo     Result      State
1       A1 Successful California
2       C5 Successful California
3       D4    Failure   New York
4       E4    Failure   New York

old.df の行の連続を維持し、new.df から新しい列を追加して、new.df からの新しいデータで old.df の内容を更新したいと思います。結果の data.frame は次のようになります。

 SampleNo     Result   NoUnit      State
1       A1 Successful      4 California
2       B4 Successful      4       <NA>
3       C5 Successful      4 California
4       D4    Failure      4   New York
5       E4    Failure     NA   New York
4

2 に答える 2

3
merge(old.df,new.df,all=TRUE)

  SampleNo     Result NoUnit      State
1       A1 Successful      4 California
2       B4 Successful      4       <NA>
3       C5 Successful      4 California
4       D4    Failure      4   New York
5       E4    Failure     NA   New York

OPによってルールが変更された後に編集します。

df <- merge(old.df,new.df,all=TRUE,by="SampleNo")
df$Result <- with(df,factor(ifelse(is.na(Result.y),
                             as.character(Result.x),as.character(Result.y))))
df$Result.x <- NULL; df$Result.y <- NULL

  SampleNo NoUnit      State     Result
1       A1      4 California Successful
2       B4      4       <NA> Successful
3       C5      4 California Successful
4       D4      4   New York    Failure
5       E4     NA   New York    Failure
于 2012-11-23T08:09:08.297 に答える
1

マージはそれ自体ではこれを行いません。ただし、実際には列でマージするのではなく、"Result"列でのみマージしてから、使用可能な場合は新しい値を使用して、そうでない場合は古い値を使用して"SampleNo"、値を結合します。"Result"

これを行うコードを次に示します。交差点のすべての列について、"SampleNo"

merge.by.sample <- function(old.df, new.df, by='SampleNo') {
  r <- merge(old.df, new.df,all=T,by=by)

  merge.col <- function(r, col) {
    xname <- paste0(col, '.x')
    yname <- paste0(col, '.y')

    r[col] <- factor(r[,yname], levels=union(levels(r[,xname]), levels(r[,yname])))
    r[col][is.na(r[col])] <- r[xname][is.na(r[col])]
    r[!(names(r) %in% c(xname, yname))]
  }

  i <- intersect(names(old.df), names(new.df))
  i <- i[!i %in% by]

  for (col in i) {
    r <- merge.col(r, col)
  }
  r
}
于 2012-11-24T03:17:56.480 に答える