【问题标题】:Mathematical operations on columns specified by vector in RR中向量指定的列的数学运算
【发布时间】:2020-05-01 08:20:00
【问题描述】:

我需要替换数据框中列子集中的特定值。具体来说,我需要将此列子集中的值 1 替换为 0.9999。我创建了一个向量,其中包含需要替换的列的列名。这些列必须是名称的子集,而不是列号。

peaches <- c( 0, 1, 0, 1)
bananas <- c( 0, 1, 1, 1)
apples <- c( 1, 1, 1, 1)
oranges <- c (0, 0, 0, 1)
fruits <- data.frame(peaches, bananas, apples, oranges)
vector <- c("apples", "bananas", "peaches")

我的第一次尝试是这样的:

fruits[vector][fruits[vector] == 1] <- 0.9999

虽然它适用于这个小型数据集,但它不会转换我正在使用的大型数据集中的值。有人知道为什么吗?

【问题讨论】:

    标签: r replace subset


    【解决方案1】:

    你可以试试:

    fruits[,vector] <- setDT(lapply(fruits[,vector], function(x) replace(x, x==1, 0.9999)))
    
      peaches bananas apples oranges
    1  0.0000  0.0000 0.9999  0.0000
    2  0.9999  0.9999 0.9999  0.0000
    3  0.0000  0.9999 0.9999  0.0000
    4  0.9999  0.9999 0.9999  0.9999
    

    【讨论】:

    • 别忘了 [vector] 规范 ;-) 你也可以试试:fruits[,vector] &lt;- apply(fruits[,vector], 2, function(x) { replace(x, x==1, 0.9999) })
    • 感谢 setDT() 我不知道的功能!
    • 是的,您会发现setDT() 在处理大型数据集时会派上用场!
    • Ça permet d'éviter de faire des copies inutiles, c'est donc beaucoup plusefficient et rapide comme méthode sur de Grosses bases de données!
    【解决方案2】:

    Tidyverse 解决方案

    library(tidyverse)
    
    peaches <- c( 0, 1, 0, 1)
    bananas <- c( 0, 1, 1, 1)
    apples <- c( 1, 1, 1, 1)
    oranges <- c (0, 0, 0, 1)
    fruits <- data.frame(peaches, bananas, apples, oranges)
    vector <- c("apples", "bananas", "peaches")
    
    fruits %>% 
      mutate_at(vector, ~ replace(., . == 1, .9999))
    #>   peaches bananas apples oranges
    #> 1  0.0000  0.0000 0.9999       0
    #> 2  0.9999  0.9999 0.9999       0
    #> 3  0.0000  0.9999 0.9999       0
    #> 4  0.9999  0.9999 0.9999       1
    

    reprex package (v0.3.0) 于 2020-01-14 创建

    【讨论】:

    • 比我快 3 秒。但我会这样做:mutate_at(vector, ~ replace(., . == 1, .9999))
    【解决方案3】:

    试试这个:

    fruits[,vector][fruits[,vector] == 1] &lt;- 0.9999

    fruits[vector] 使用 data.frame 是向量列表(长度相同)这一事实,也许“矩阵”方法更适合。

    【讨论】:

    • 我收到此错误代码:[.data.table(*tmp*, , LGSTC) 中的错误:j([...] 中的第二个参数)是单个符号,但列名 'LGSTC'没有找到。也许您打算使用 DT[, ..LGSTC]。与 data.frame 的这种差异是经过深思熟虑的,并在 FAQ 1.1 中进行了解释。
    • @TiberiusGracchus2020 你的对象是data.table吗?
    • 不确定...如何检查它是数据框还是数据表?
    • @TiberiusGracchus2020 您可以使用str(data)is.data.table(data) 查找它,但如果您使用data.table 包来处理您的数据,您可能已经将您的data.frame“转换”为data.table,虽然它们相似,但可能会出现一些错误。您发布的错误提到 data.table。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多