【问题标题】:r plyr mapvalues with factors / dataframes shows numbers as result带有因子/数据框的 r plyr mapvalues 将数字显示为结果
【发布时间】:2014-07-28 17:40:44
【问题描述】:

链接到我以前的问题:r plyr revalue limitation of number of operations? 还有这个请求:mapvalues in plyr gives unexpected output when "to" argument is a factor...is it a bug?

我想更改数据框因子中级别的值,我在一个因子中有 300 个要重命名的级别,而在另一个因子中有 3000 个级别。所以使用 c("", "") 是没有问题的。我创建了两个用于重命名的新数据框,其中包含要匹配的值和要重估的值。现在,我遇到了一个小问题,我目前的 R 技能水平无法解决。

让我们重用 R 食谱示例:

首先使用值创建一个数据框:

library(plyr)
cat <- c("alpha","beta","gamma","alpha","beta")
amount <- c(2, 5, 8, 3, 4)
df <- data.frame(cat, amount)

   df
    cat amount
1 alpha      2
2  beta      5
3 gamma      8
4 alpha      3
5  beta      4

mapvalues(df$cat, c("beta", "gamma"), c("two", "three"))

[1] alpha two   three alpha two  
Levels: alpha two three

这可行,将一个值更改为另一个值,并删除未使用的级别。

让我们尝试对包含所有需要匹配的值及其替换的数据框使用一种方法。

val <- c("beta", "gamma")
text <- c("two", "three")
reval <- data.frame(val, text)

reval

    val  text
1  beta   two
2 gamma three

mapvalues(df$cat, reval$val, reval$text)
[1] alpha 2     1     alpha 2    
Levels: alpha 2 1

这会将级别的值替换为数字。那时我有点卡在那里,因为我不知道如何根据我的情况调整提供的第二个链接2 中给出的解决方案。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    问题在于data.frame 将您的字符转换为因子。所以你既可以使用stringsAsFactors=FALSE,也可以使用as.character

    # version 1 
    val <- c("beta", "gamma")
    text <- c("two", "three")
    reval <- data.frame(val, text, stringsAsFactors=FALSE)
    mapvalues(df$cat, 
              reval$val, 
              reval$text)
    
    # version 2
    val <- c("beta", "gamma")
    text <- c("two", "three")
    reval <- data.frame(val, text)
    mapvalues(df$cat, 
              as.character(reval$val), 
              as.character(reval$text))
    

    小心:您使用levels 的解决方案将“beta”替换为“three”,将“gamma”替换为“two”,而不是预期将“beta”替换为“two”,将“gamma”替换为“three”。这是因为“三”在“二”之前("h"&lt;"w")。

    【讨论】:

    • 谢谢,我没有发现我的解决方案有缺陷。我试过你的,但我的 3000 级数据框得到了一个“x 中不存在以下from 值”答案 - 它列出了我检查为“x”中确实存在的值。也许是地图值的限制???我想我真的坚持那个......但我认为它应该是 R 中的一些标准操作,以正确重命名关卡,即使你有很多这样的?
    • 你能做一个可重现的例子,你会得到上面评论中提到的错误。否则我们无法猜测问题可能是什么。
    • 顺便说一句,我也使用了这个: reval$text
    • 我已经删除了我的关卡解决方案,因为我不希望其他人使用它并出现意外错误...
    • 所以我已经尝试过适当地调整它以适应我的实际案例问题,并且它有效!这太棒了...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多