不能替换列表r中的因子变量

时间:2017-04-21 11:03:30

标签: r list

我有以下数据帧结构列表:

str(mylist)

List of 2
 $ L1   :'data.frame':   12471 obs. of 3 variables:
 ...$ colA : Date[1:12471], format: "2006-10-10" "2010-06-21" ...
 ...$ colB : int [1:12471], 62 42 55 12 78 ...
 ...$ colC : Factor w/ 3 levels "type1","type2","type3",..: 1 2 3 2 2 ...

我想用新系数type1替换type2type4

我试过了:

mylist <- lapply(mylist, transform, colC =
                       replace(colC, colC == 'type1','type4'))
Warning message:
1: In `[<-.factor`(`*tmp*`, list, value = "type4") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, list, value = "type4") :
  invalid factor level, NA generated

我不想用stringAsFactor=F读取我的初始数据,但我尝试使用以下内容在我的初始数据集中添加type4(在拆分成数据帧列表之前):

levels(mydf$colC) <- c(levels(mydf$colC), "type4")

但是在尝试替换时我仍然遇到同样的错误。

如何判断替换type4是否被视为一个因素?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用levels选项续订您的因素。 如, status <- factor(status, order=TRUE, levels=c("1", "3", "2",...)) c("1", "3", "2",...)是您的type4

答案 1 :(得分:0)

正如您所说,关键是要添加新的因子级别。

## Test data:
mydf <- data.frame(colC = factor(c("type1", "type2", "type3",  "type2", "type2")))
mylist <- list(mydf, mydf)

您的数据有三个因素级别:

> str(mylist)
List of 2
 $ :'data.frame':   5 obs. of  1 variable:
  ..$ colC: Factor w/ 3 levels "type1","type2",..: 1 2 3 2 2
 $ :'data.frame':   5 obs. of  1 variable:
  ..$ colC: Factor w/ 3 levels "type1","type2",..: 1 2 3 2 2

现在添加第四个因子级别,然后您的replace命令应该起作用:

## Change levels:
for (ii in seq(along = mylist)) levels(mylist[[ii]]$colC) <- 
    c(levels(mylist[[ii]]$colC), "type4")

## Replace level:
mylist <- lapply(mylist, transform, colC = replace(colC, 
    colC == 'type1','type4'))

新数据有四个因素级别:

> str(mylist)
List of 2
 $ :'data.frame':   5 obs. of  1 variable:
  ..$ colC: Factor w/ 4 levels "type1","type2",..: 4 2 3 2 2
 $ :'data.frame':   5 obs. of  1 variable:
  ..$ colC: Factor w/ 4 levels "type1","type2",..: 4 2 3 2 2