【问题标题】:Replacing values in a data frame column替换数据框列中的值
【发布时间】:2014-11-12 20:47:47
【问题描述】:

给定一个大型数据框,其中有一列具有唯一值

(一、二、三、四、五、六、七、八)

我想替换一些值。例如,每次出现的 'ONE' 都应替换为 '1' 和

'FOUR' -> '2SQUARED'
'FIVE' -> '5'
'EIGHT' -> '2CUBED'

其他值应保持不变。

IF/ELSE 将永远运行。如何应用矢量化解决方案? match() 是正确的方法吗?

【问题讨论】:

  • plyr 包中检查mapvalues
  • 我认为这是迄今为止最好的解决方案,因为我说它是一个大数据框。我有很多潜艇要做,所以创建 2 个向量 replace = c(...) 和 with = c(...) 在 mapvalues() 中使用是最简单的

标签: r dataframe vectorization


【解决方案1】:

您的专栏可能是factor。试试这个。使用 rnso 的 data,我建议您首先创建两个要更改的值和要更改的值的向量

from <- c("FOUR", "FIVE", "EIGHT")
to <- c("2SQUARED", "5", "2CUBED")

然后将因子替换为

with(data, levels(vals)[match(from, levels(vals))] <- to)

这给了

data
#       vals
# 1      ONE
# 2      TWO
# 3    THREE
# 4 2SQUARED
# 5        5
# 6      SIX
# 7    SEVEN
# 8   2CUBED

【讨论】:

    【解决方案2】:

    使用@rnso 数据集

    library(plyr)
    transform(data, vals = mapvalues(vals, 
              c('ONE', 'FOUR', 'FIVE', 'EIGHT'),
              c('1','2SQUARED', '5', '2CUBED'))) 
    #       vals
    # 1        1
    # 2      TWO
    # 3    THREE
    # 4 2SQUARED
    # 5        5
    # 6      SIX
    # 7    SEVEN
    # 8   2CUBED
    

    【讨论】:

    • 我使用了 mapvalues,它完全符合我的要求。谢谢
    • @MaxWen - 你要加载一个库只是为了改变因素?你看到我的回答了吗?
    • @RichardScriven 是的,我看到了,但我已经完成了我的项目。您是正确的,该列是一个因素,您的解决方案看起来可行。通常我宁愿不加载库,但我不介意在这里,因为我需要了解更多关于 plyr 的信息。我会赞成您的解决方案,但我缺乏这样做的代表。
    【解决方案3】:

    尝试使用 base R 进行以下操作:

    data = structure(list(vals = structure(c(4L, 8L, 7L, 3L, 2L, 6L, 5L, 
    1L), .Label = c("EIGHT", "FIVE", "FOUR", "ONE", "SEVEN", "SIX", 
    "THREE", "TWO"), class = "factor")), .Names = "vals", class = "data.frame", row.names = c(NA, 
    -8L))
    
    initial = c('ONE', 'FOUR', 'FIVE', 'EIGHT')
    final = c('1','2SQUARED', '5', '2CUBED')
    
    myfn = function(ddf, init, fin){
        refdf = data.frame(init,fin)
        ddf$new = refdf[match(ddf$vals, init), 'fin']
        ddf$new = as.character(ddf$new)
        ndx = which(is.na(ddf$new))
        ddf$new[ndx]= as.character(ddf$vals[ndx])
        ddf
    }
    
    myfn(data, initial, final)
    
       vals      new
    1   ONE        1
    2   TWO      TWO
    3 THREE    THREE
    4  FOUR 2SQUARED
    5  FIVE        5
    6   SIX      SIX
    7 SEVEN    SEVEN
    8 EIGHT   2CUBED
    > 
    

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 2018-09-29
      • 2022-01-14
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多