【问题标题】:Is it possible to do the binary logarithm plus one (log2+1) in an entire dataframe?是否可以在整个数据帧中进行二进制对数加一(log2+1)?
【发布时间】:2021-08-11 13:16:03
【问题描述】:

这是我的数据:

dat <- mtcars
dat$Brands <- rownames(dat)
dat$Info <- rep("Info", length(rownames(mtcars)))

我已经看到有很多方法可以对整个数据框执行某些操作。 mutatesapply 等。但是,对于某些特定功能,它不起作用。

最接近的例子是如果你想做log2+1

这个我试过了……

data_log <- dat %>% mutate(across(where(is.numeric), log2+1))

但它给了我这个错误......

错误:mutate() 输入 ..1 有问题。 ℹ..1 = across(where(is.numeric), log2 + 1)。 x 二元运算符的非数字参数 运行rlang::last_error() 看看哪里出错了。

你知道有没有办法运行这种类型的函数?

【问题讨论】:

    标签: r dataframe dplyr logarithm


    【解决方案1】:

    您的方法是正确的,但语法需要一些更正。这里需要使用 lambda 或匿名函数。

    使用dplyr 你可以使用across 作为-

    library(dplyr)
    dat <- dat %>% mutate(across(where(is.numeric), ~log2(.) +1))
    

    或者在基础 R 中 -

    cols <- sapply(dat, is.numeric)
    dat[cols] <- lapply(dat[cols], function(x) log2(x) + 1)
    

    【讨论】:

    【解决方案2】:

    其实log2可以直接在数值数据框上执行,可以试试下面的代码

    idx <- sapply(dat, is.numeric)
    dat[idx] <- log2(dat[idx])+1
    

    【讨论】:

      【解决方案3】:

      我们可以使用data.table 方法。

      library(data.table)
      cols <- names(which(sapply(dat, is.numeric)))
      setDT(dat)[, (cols) := lapply(.SD, function(x) log2(x) + 1), .SDcols = cols]
      

      【讨论】:

        猜你喜欢
        • 2021-02-23
        • 2012-01-20
        • 2011-05-21
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多