68

2001 年から 2007 年までの請求データを含むデータフレーム (14.5K 行 x 15 列) があります。

2008 年の新しいデータを次のように追加します。alltime <- rbind(alltime,all2008)

残念ながら、それは警告を生成します:

> Warning message:
In `[<-.factor`(`*tmp*`, ri, value = c(NA, NA, NA, NA, NA, NA, NA,  :
  invalid factor level, NAs generated

私の推測では、以前のデータフレームに名前がなかった新しい患者が何人かいるため、それらにどのレベルを与えるべきかわかりません。同様に、「紹介医」の列に新しい未公開の名前が表示されます。

解決策は何ですか?

4

7 に答える 7

31

2つのタイプの不一致が原因である可能性がありますdata.frames

まず、チェックタイプ(クラス)。診断目的でこれを行います:

new2old <- rbind( alltime, all2008 ) # this gives you a warning
old2new <- rbind( all2008, alltime ) # this should be without warning

cbind(
    alltime = sapply( alltime, class),
    all2008 = sapply( all2008, class),
    new2old = sapply( new2old, class),
    old2new = sapply( old2new, class)
)

次のような行があると思います。

            alltime  all2008   new2old  old2new
...         ...      ...       ...      ...
some_column "factor" "numeric" "factor" "character"
...         ...      ...       ...      ...

もしそうなら、説明: rbindタイプが一致することをチェックしないでください。コードを分析するrbind.data.frameと、最初の引数が出力タイプを初期化したことがわかります。最初のdata.frameタイプが因子である場合、出力data.frame列はレベルの因子unique(c(levels(x1),levels(x2)))です。ただし、2番目のdata.frame列が因数分解されていない場合levels(x2)NULL、であるため、レベルは拡張されません。

それはあなたの出力データが間違っていることを意味します!NA真の値の代わりに'があります

私はそれを推測します:

  1. 別のR/RODBCバージョンで古いデータを作成するため、タイプはさまざまな方法で作成されます(さまざまな設定-小数点記号の可能性があります)
  2. 問題のある列にNULLまたは特定のデータがあります。誰かがデータベースの下の列を変更します。

解決:

間違った列を見つけて、それが間違っていて修正された理由を見つけてください。症状ではなく原因を排除します。

于 2009-10-28T23:12:31.550 に答える
9

1) stringsAsFactor を FALSE に設定してデータ フレームを作成します。これにより、要因の問題が解決するはずです

2) その後 rbind を使用しないでください。データ フレームが空の場合、列名が台無しになります。単純に次のようにします。

df[nrow(df)+1,] <- c("d","gsgsgd",4)

/

> df <- data.frame(a = character(0), b=character(0), c=numeric(0))

> df[nrow(df)+1,] <- c("d","gsgsgd",4)

Warnmeldungen:
1: In `[<-.factor`(`*tmp*`, iseq, value = "d") :
  invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "gsgsgd") :
  invalid factor level, NAs generated

> df <- data.frame(a = character(0), b=character(0), c=numeric(0), stringsAsFactors=F)

> df[nrow(df)+1,] <- c("d","gsgsgd",4)

> df
  a      b c
1 d gsgsgd 4
于 2013-03-30T12:25:16.260 に答える
3

型の不一致、特に要因についても同じ問題がありました。2 つの互換性のあるデータセットを接着する必要がありました。

私の解決策は、両方のデータフレームの要素を「文字」に変換することです。その後、それは魅力のように機能します:-)

    convert.factors.to.strings.in.dataframe <- function(dataframe)
    {
        class.data  <- sapply(dataframe, class)
        factor.vars <- class.data[class.data == "factor"]
        for (colname in names(factor.vars))
        {
            dataframe[,colname] <- as.character(dataframe[,colname])
        }
        return (dataframe)
    }

2 つのデータフレームの実行の型を確認したい場合 (var 名を変更):

    cbind("orig"=sapply(allSurveyData, class), 
          "merge" = sapply(curSurveyDataMerge, class),
          "eq"=sapply(allSurveyData, class) == sapply(curSurveyDataMerge, class)
    )
于 2012-02-06T21:12:29.080 に答える
0

これは、2つのデータフレームの共通の行名を取得し、基本的に要素であるフィールドを見つけてrbindを実行し、新しい要素を追加してrbindを実行する関数です。これにより、要因の問題が処理されます。

rbindCommonCols<-function(x, y){

commonColNames = intersect(colnames(x), colnames(y))
x = x[,commonColNames]
y = y[,commonColNames]

colClassesX = sapply(x, class)
colClassesY = sapply(y, class)
classMatch = paste( colClassesX, colClassesY, sep = "-" )
factorColIdx = grep("factor", classMatch)

for(n in factorColIdx){ 
    x[,n] = as.factor(x[,n])
    y[,n] = as.factor(y[,n])
}

for(n in factorColIdx){ 
    x[,n] = factor(x[,n], levels = unique(c( levels(x[,n]), levels(y[,n]) )))
    y[,n] = factor(y[,n], levels = unique(c( levels(y[,n]), levels(x[,n]) )))  
} 

res = rbind(x,y)
res

}

于 2013-08-01T13:51:07.143 に答える