【问题标题】:R equivalent to Stata's `compress` command?R相当于Stata的`compress`命令?
【发布时间】:2012-02-20 00:45:31
【问题描述】:

Stata 有一个名为compress 的命令,它查看所有数据行并尝试将每个行强制转换为最有效的格式。例如,如果你有一堆整数作为字符向量存储在 data.frame 中,它会将其强制转换为整数。

我可以想象如何在 R 中编写这样一个函数,但它已经存在了吗?

【问题讨论】:

  • 如果某些指定的值的一部分不是 NA,编写测试整数和强制的代码会很容易,但我认为一般答案是“否”。
  • 这也是我的想法。诀窍是编写高效的代码,这样它就不会永远运行。正则表达式是显而易见的开始方式,但可能太慢了。
  • 如果您要使用 length(levels(factor())) 进行测试并转换为因子,如果该值小于向量的 hte 长度的 20%,您还可以节省空间。同样,您可以检查向量 vrc 的哪一部分具有值 == trunc(vec) 这可能是测试将数字强制转换为整数是否明智。我自己并没有看到太多正则表达式方法的适用性,但也许我又迟钝了。
  • @DWin 因子的空间效率始终低于 32 位平台上的字符串。它们在 64 位平台上效率更高,级别比率更小(由于 sizeof(SEXP) == 2 * sizeof(int)),因此规则会因平台而异......(如果你想学究;))
  • stata 的“压缩”不会将字符数据类型转换为数字数据类型。它只会优化字符和数字数据类型的存储。可以说,数字不超过 10 的变量将从浮点数或双精度数转换为“字节”数据类型(R 不支持的非常方便的格式)。但是1到10个数字的字符变量不会转成数字

标签: r


【解决方案1】:

从技术上讲,read.table 正是在type.convert 的帮助下做到了这一点。所以你可以使用它——它不是最有效的方法,但可能是最简单的:

df <- as.data.frame(lapply(df ,function(x) type.convert(as.character(x))))

不过,在实践中,最好有选择地执行此操作,因此您只需触摸字符/因素:

for (i in seq.int(df)) if (is.factor(df[[i]]) || is.character(df[[i]]))
    df[[i]] <- type.convert(as.character(df[[i]]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多