R计算数据框的元素并添加一行

时间:2015-01-27 03:35:00

标签: r

我正在使用以下代码将数据读入两个数据框:

IdaEmpA <- data.frame(table(unlist(DadosA$idade)))
IdaEmpB <- data.frame(table(unlist(DadosB$idade)))

然后我想在这些数据帧中添加一个具有NAs数量的行。我试过这样:

IdaEmpA = rbind(IdaEmpA,c(7,sum(is.na(DadosA$idade))))
IdaEmpB = rbind(IdaEmpB,c(7,sum(is.na(DadosB$idade))))

结果数据是:

> IdaEmpA
  RespA QuantA
1     1     11
2     2     13
3     3     15
4     4      3
5     5     18
6     6      1
> IdaEmpB
  RespB QuantB
1     1     18
2     2     14
3     3     21
4     4      2
5     6     13

但是我收到警告,并且没有将值添加到第一列:

Warning message:
In `[<-.factor`(`*tmp*`, ri, value = 7) :
nível de fator inválido, NA gerado

Warning message:
In `[<-.factor`(`*tmp*`, ri, value = 7) :
nível de fator inválido, NA gerado

警告后的结果:

> IdaEmpA
  RespA QuantA
1     1     11
2     2     13
3     3     15
4     4      3
5     5     18
6     6      1
7  <NA>      1
> IdaEmpB
  RespB QuantB
1     1     18
2     2     14
3     3     21
4     4      2
5     6     13
6  <NA>      3

如何设置值7而不是NA ???

任何线索都可以帮助我,谢谢!

1 个答案:

答案 0 :(得分:2)

当存在因子列时会发生这种情况。如果该列的新行中的值不在因子列的levels中,您将收到此消息。例如,如果我将两列都作为&#34;数字&#34; ,这不会是一个错误。

 rbind(IdaEmpA,c(7,5))
 #  RespA QuantA
 #1     1     11
 #2     2     13
 #3     3     15
 #4     4      3
 #5     5     18
 #6     6      1
 #7     7      5

如果其中一列是factor

  IdaEmpA$RespA <- factor(IdaEmpA$RespA)
  rbind(IdaEmpA,c(7,5))
  #  RespA QuantA
  #1     1     11
  #2     2     13
  #3     3     15
  #4     4      3
  #5     5     18
  #6     6      1
  #7  <NA>      5
  #Warning message:
  #In `[<-.factor`(`*tmp*`, ri, value = 7) :
  # invalid factor level, NA generated

因为,&#34; IdaEmpA&#34;似乎属于&#34;数字&#34; class,我们可以在执行rbind

之前将其转换为数字
  IdaEmpA$RespA <- with(IdaEmpA, as.numeric(levels(RespA))[RespA])

如果有多个列需要重新转换为numeric

  indx <- sapply(IdaEmpA, is.factor)
  IdaEmpA[indx] <- lapply(IdaEmpA[indx], function(x)
                      with(x, as.numeric(levels(x))[x])) 

使用read.table/read.csv读取数据集时可以避免这一切。您可以使用stringsAsFactors=FALSE以便&#34;字符&#34; class不会转换为&#34; factor&#34;

更正rbind步骤后,merge会更容易。

数据

IdaEmpA <- structure(list(RespA = 1:6, QuantA = c(11L, 13L, 15L, 3L, 18L, 
1L)), .Names = c("RespA", "QuantA"), class = "data.frame", row.names = 
c("1", "2", "3", "4", "5", "6"))