【问题标题】:Improving R coding with sapply help在 sapply 帮助下改进 R 编码
【发布时间】:2011-04-01 19:48:38
【问题描述】:

我正在为一些代码而苦苦挣扎。我可以让它非常低效地工作,但认为必须有更好的方法来解决它。我正在尝试从几个不同的变量编译一个变量。在编码变量中,“跳过”被编码为特定数字(例如“99”下面的示例)。我正在尝试根据其中 10 个变量创建一个总成本变量。

通过这种方式,我编写了效率低下的代码:

var1 <- ifelse(data$v1<99, data$v1, 0)  
var2 <- ifelse(data$v2<99, data$v2, 0) 
... 
var10 <- ifelse(data$v1<99, data$v10, 0) 
sumvar <- var1 + var2 + var3 + var4 + var5 + var6 + var7 + var8 + var9 + var10

我尝试使用sapply 命令使它更优雅一点,但没有奏效。我只是想看看是否有人可以就我的代码失败的原因给我一些提示或帮助。我把它放到一个列表环境中(我认为在尝试了其他类似 cbind 之后是正确的)并尝试进行特定的调用,但出现错误。作为示例代码,我设置了以下内容:

set.seed(1234)
data <- data.frame(x=rnorm(30), y=rnorm(30), z=rnorm(30))
data$x <- ifelse(data$x > 1, 99, data$x)
data$y <- ifelse(data$y > 1, 99, data$y)
data$z <- ifelse(data$z > 1, 99, data$z)

t.list <- list(data$x, data$y, data$z)

sumvar1 <- sapply(1:length(t.list), function(i){
    tempvar <- ifelse(t.list[i] !=99, t.list[i], 0)
    sumvar1 <- sumvar1 + tempvar
})

问题是当我尝试我的实际代码(或此代码)时,我得到:

Error in storage.mode(test) <- "logical" : 
  (list) object cannot be coerced to type 'double'
Calls: sapply -> lapply -> FUN -> ifelse

显然我做错了什么,但我不确定是什么。我查看了 ifelse 的帮助文件,但我不明白输出的错误消息。我已经让代码以低效的方式运行,但我真的很想获得一些关于如何改进我未来在 R 中编码的反馈和知识。

谢谢!

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    如果我正确理解您的问题,我认为您需要做的就是:

    ## Set any skip values to be equal to zero
    data[data == 99] = 0
    ## Work out the row means
    apply(data, 1, sum)
    

    一条评论。您考虑使用 R 的缺失值对象 NA 而不是将 99 设置为 0。

    【讨论】:

    • OP:请注意,如果您将99 设置为NA,您将需要apply(data, 1, sum, na.rm=TRUE)
    【解决方案2】:

    如果 data.frame 中的所有变量的值相同 (99),只需一次对整个 data.frame 进行操作。

    > sum(data*(data < 99))
    [1] -39.68282
    

    如果你想要行总和

    rowSums(data*(data < 99))  # faster than apply(data*(data < 99), 1, sum)
    

    如果你想要列总和

    colSums(data*(data < 99))  # faster than apply(data*(data < 99), 2, sum)
    

    【讨论】:

    • +1 很好的答案;)我不确定托尼是想要总和还是行总和。
    • 感谢您的帮助!我会调查一下。我遇到的一个问题是,我总结的这些值只是更大数据集的一部分。我认为,如果不出意外,这是一种简化我的代码的方法,方法是将它们编码成一个较小的 data.frame 并按照您的建议制作应用程序。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多