【问题标题】:add output values as new row to source df将输出值作为新行添加到源 df
【发布时间】:2014-11-07 19:01:28
【问题描述】:

这似乎是一个如此简单的任务,它让我无法弄清楚。

使用 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 个警告(使用 warnings() 查看)

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

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

new.df

match.names(clabs, names(xi)) 中的错误: 名字与以前的名字不匹配

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

非常感谢任何帮助。

【问题讨论】:

  • 您能重新格式化并将您的代码放入代码标签中吗?这将有助于我们阅读。
  • 如果您提供示例数据也会很有帮助。
  • 我将添加示例数据
  • 我无法从您的示例中看出,但我怀疑您的 df 列是因素。如果是这样,那么您的rbinding 正在尝试添加未知级别的因子。可以加str(df)吗?

标签: r rows apply


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 2021-08-18
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多