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的真正价值,而不是
我想:
解:
找到错误的列并找出其错误和修复的原因.消除原因不是症状.
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)
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)