Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利用sapply帮助改进R编码_R_Sapply - Fatal编程技术网

利用sapply帮助改进R编码

利用sapply帮助改进R编码,r,sapply,R,Sapply,我正在努力处理一些代码。我可以让它非常低效地工作,但我认为一定有更好的方法来解决它。我试图从几个不同的变量编译一个变量。在编码变量中,“跳过”被编码为一个特定的数字(例如下面的“99”)。我试图根据其中10个变量创建一个总成本变量 通过这种方式,我生成了低效的代码: var1 <- ifelse(data$v1<99, data$v1, 0) var2 <- ifelse(data$v2<99, data$v2, 0) ... var10 <- ifelse

我正在努力处理一些代码。我可以让它非常低效地工作,但我认为一定有更好的方法来解决它。我试图从几个不同的变量编译一个变量。在编码变量中,“跳过”被编码为一个特定的数字(例如下面的“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
问题是,当我尝试我的实际代码(或此代码)时,我得到:

Error in storage.mode(test) <- "logical" : 
  (list) object cannot be coerced to type 'double'
Calls: sapply -> lapply -> FUN -> ifelse
存储错误。模式(测试)lappy->FUN->ifelse
很明显我做错了什么,但我不确定是什么。我已经查看了ifelse的帮助文件,但是我不理解输出的错误消息。我已经让代码以低效的方式运行,但我真的很想得到一些反馈和知识,如何改进我未来在R中的编码

谢谢

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

> sum(data*(data < 99))
[1] -39.68282
>总和(数据*(数据<99))
[1] -39.68282
如果你想要行和

rowSums(data*(data < 99))  # faster than apply(data*(data < 99), 1, sum)
rowSums(data*(data<99))#比apply(data*(data<99)快,1,sum)
如果你想要列和

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

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

## 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。

+1非常好的答案;)我不确定Tony是想要总数还是行数。谢谢你的帮助!我会调查的。我遇到的一个问题是,我正在求和的这些值只是更大数据集的一部分。我认为,如果没有其他方法,这是一种简化代码的方法,方法是将代码编码成更小的data.frame,并按照您的建议制作应用程序。再次感谢您:请注意,如果您将
99
设置为
NA
,您将需要
apply(数据,1,总和,NA.rm=TRUE)
## Set any skip values to be equal to zero
data[data == 99] = 0
## Work out the row means
apply(data, 1, sum)