将输出值添加为源df的新行

时间:2014-11-07 19:01:29

标签: r rows apply

这似乎是一项如此简单的任务,它杀了我,我无法弄明白。

使用apply后我有输出,现在我要做的就是将输出添加为data.frame末尾名为uniq的新行。

  

DF

ID  A    B    C
1   asd  dfg  ghj
2   qwe  sde  cdf
3   wed  thy  red
4   asd  sde  grf
5   swq  sde  hty
  

uniq = apply(df,2,function(x)length(unique(x)))

uniq输出:命名为int [1:4]

ID  A   B   C
 5  4   3   5
  

new.df = rbind(df,uniq)

我想看到什么......

ID    A    B    C
1    asd  dfg  ghj
2    qwe  sde  cdf
3    wed  thy  red
4    asd  sde  grf
5    swq  sde  hty
5    4    3    5  
  

错误 - 有4个警告(使用警告()来查看它们)

我查看数据,虽然添加了一个新行,但总数不存在,而是我在每个单元格中获得了NA(除了两个但我不知道为什么)。

我看到也许我不能只使用rrbind,因为它们不是相同类型的文件,甚至尝试将输出转换为像某人建议的矩阵,但它不起作用。 Arghhh!

  

new.df< - rbind(df,matrix(uniq,ncol = 25))

     

match.names(clabs,names(xi))出错:     名称与以前的名称不匹配

我检查了标题并且它们匹配 - 在所有uniq数据来自原始df。

之后

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可能已经获得了因子列。我首先要说的是,你正在尝试的东西无论如何都不是一个好主意,因为数据框的列包含变量,所以这样做实际上会为每一列添加一个观察。

但是你可以通过将因子列强制转换为字符并附加计算来解决问题并获得所需的结果。从数据框df

开始
sapply(df, class)
#       ID         A         B         C 
# "integer"  "factor"  "factor"  "factor" 

我们可以使用一个小函数f来操作列

f <- function(x) {
    c(if(is.factor(x)) levels(x)[x] else x, length(unique(x)))
}

现在ID仍然是数字,但其他三列是字符,可以通过在创建新数据框时设置stringsAsFactors = FALSE来强制转换为新因素

data.frame(lapply(df, f), stringsAsFactors = FALSE)
#   ID   A   B   C
# 1  1 asd dfg ghj
# 2  2 qwe sde cdf
# 3  3 wed thy red
# 4  4 asd sde grf
# 5  5 swq sde hty
# 6  5   4   3   5