r - 如何按行获取非零元素的平均值,改变条件使用哪些列
问题描述
假设我有以下数据表:
tempmat=matrix(c(1,1,0,4,1,0,0,4,0,1,0,4, 0,0,1,4, 0,0,0,5),5,4,byrow=T)
tempmat=rbind(rep(0,4),tempmat)
tempmat=data.table(tempmat)
names(tempmat)=paste0('prod1vint',1:4)
看起来像:
prod1vint1 prod1vint2 prod1vint3 prod1vint4
1: 0 0 0 0
2: 1 1 0 4
3: 1 0 0 4
4: 0 1 0 4
5: 0 0 1 4
6: 0 0 0 5
我想定义一个新列 TN,它以下列方式逐行取平均值。
- 对于每一行,找到从左到右的第一个非零元素。
- 然后,找到右侧所有非零元素的平均值。
输出应该是:
prod1vint1 prod1vint2 prod1vint3 prod1vint4 TN
1: 0 0 0 0 NA
2: 1 1 0 4 2.5
3: 1 0 0 4 4
4: 0 1 0 4 4
5: 0 0 1 4 4
6: 0 0 0 5 NA
NA 的出现是因为在 1 中:没有非零元素,在 6 中:在第一个非零元素的右侧没有非零元素。
解决方案
使用apply
逐行,我们可以首先找出行中不为 0 的索引。然后计算mean
非零值if
,至少有一个非零值,并且非零值不存在于最后一列else
returnNA
中。
tempmat$TN <- apply(tempmat, 1, function(x) {
inds <- x != 0
if (any(inds) & which.max(inds) != length(x))
mean(Filter(function(f) f > 0, x[(which.max(inds) + 1) : length(x)]))
else
NA
})
tempmat
# prod1vint1 prod1vint2 prod1vint3 prod1vint4 TN
#1: 0 0 0 0 NA
#2: 1 1 0 4 2.5
#3: 1 0 0 4 4.0
#4: 0 1 0 4 4.0
#5: 0 0 1 4 4.0
#6: 0 0 0 5 NA
推荐阅读
- java - LinkedHashMap 和 NullPointerException
- php - php -ews - 推送通知
- html - Flexbox & Edge:打印时弯曲方向不起作用
- node.js - npm install --production 和 bcrypt 问题,适用于 npm 6.2.0
- ruby-on-rails - 如何按 ActiveStorage 附件名称排序收集?
- postgresql - 错误:整数的无效输入语法:“1 NN
- apache-spark - 需要让我的火花代码并行处理
- python - 在参数中使用带有 unicode 字符的 {% url %} 反向 (Django)
- html - 在移动视图中将页脚保持在页面底部
- java - 自定义视图未添加到 RecyclerView 的 FrameLayout