将具有看不见的字符串值的新记录附加到数据帧时看不见的因子级别,导致警告并导致NA

Far*_*rel 66 r append dataframe r-factor

我有一个大型数据框(14552行乘15列),包含2001年至2007年的计费数据.我使用sqlFetch获取2008年的数据.为了将2008年数据附加到前7年的数据,可以如下进行

alltime <- rbind(alltime,all2008)

不幸的是,生成

警告消息:In alltime <- rbind(alltime,all2008)(alltime <- rbind(alltime,all2008),ri,value = c(NA,NA,NA,NA,NA,NA,NA,:无效因子级别,生成的NAs)

我的猜测是,有一些新病人的名字不在之前的数据框中,因此不知道给它的级别.类似于推荐医生专栏中新的看不见的名字.

R导入数据并自动计算出数字和非数据的方式(从而使其成为一个因素)很棒 - 直到你必须进一步操纵它然后它变得很痛苦.我如何优雅地克服我的问题?

Mar*_*rek 30

它可能是由两种类型的不匹配引起的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)
)
Run Code Online (Sandbox Code Playgroud)

我希望有一行看起来像:

            alltime  all2008   new2old  old2new
...         ...      ...       ...      ...
some_column "factor" "numeric" "factor" "character"
...         ...      ...       ...      ...
Run Code Online (Sandbox Code Playgroud)

如果是,那么解释: rbind不检查类型匹配.如果您分析rbind.data.frame代码,那么您可以看到第一个参数初始化输出类型.如果在第一个data.frame类型是一个因子,那么输出data.frame列是具有级别的因子unique(c(levels(x1),levels(x2))).但是当第二data.frame列不会再因素levels(x2)就是NULL,所以水平不延长.

这意味着您的输出数据是错误的!还有NA的真正价值,而不是

我想:

  1. 你使用另一个R/RODBC版本创建旧数据,因此使用不同的方法创建类型(不同的设置 - 可能是小数分隔符)
  2. 有问题的列中有NULL或某些特定数据,例如.有人更改数据库下的列.

解:

找到错误的列并找出其错误和修复的原因.消除原因不是症状.


Ste*_*lou 27

一种"简单"的方法是在导入文本数据时不将字符串设置为因子.

请注意,这些read.{table,csv,...}函数采用一个stringsAsFactors参数,默认设置为TRUE.您可以FALSE在导入和处理rbind数据时将其设置为.

如果您想将列设置为最后的因素,您也可以这样做.

例如:

alltime <- read.table("alltime.txt", stringsAsFactors=FALSE)
all2008 <- read.table("all2008.txt", stringsAsFactors=FALSE)
alltime <- rbind(alltime, all2008)
# If you want the doctor column to be a factor, make it so:
alltime$doctor <- as.factor(alltime$doctor)
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 9

1)创建数据帧,其中stringsAsFactor设置为FALSE.这应解决因素问题

2)之后不要使用rbind - 如果数据框为空,它会混淆列名.简单地这样做:

df[nrow(df)+1,] <- c("d","gsgsgd",4)
Run Code Online (Sandbox Code Playgroud)

/

> 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
Run Code Online (Sandbox Code Playgroud)