r - 在 R 中对矩阵进行子集化
问题描述
我有一个捆绑矩阵,我想根据列总和(预算)和第一个值对其进行子集化。如果第一个值为 0 并且我可以添加该值并且仍然低于预算,我想删除该列。
例如,如果我的预算是 10(列总和)并且我的矩阵如下所示:
col1 col2 col3 col4
1 2 2 0 0
2 3 3 3 3
3 0 0 2 0
4 4 0 4 0
我希望结束矩阵看起来像这样,因为 col4 第 1 行中的 0 可以包含在内,并且列总和将低于 10:
col1 col2 col3
1 2 2 0
2 3 3 3
3 0 0 2
4 4 0 4
我的代码目前是:
for (i in 1:ncol(df)) {
if (df[1,i]==0) {
df<-df[,which(colSums(df)+2>10)]
}
}
该代码不起作用,因为它还删除了第 2 列。我认为它在对矩阵进行子集化时没有考虑 if 语句。
谢谢。
解决方案
一种选择是使用colSums
第一行中的值创建条件以对列进行子集化。 colSums
会更有效率
bids <- 2
df1[which(!(df1[1,] == 0 & (colSums(df1) + bids) < 10))]
# col1 col2 col3
#1 2 2 0
#2 3 3 3
#3 0 0 2
#4 4 0 4
或者使用for
循环
for(i in seq_along(df1)) if(df1[1, i] == 0 & sum(df1[[i]]) + bids < 10) df1[[i]] <- NULL
数据
df1 <- structure(list(col1 = c(2L, 3L, 0L, 4L), col2 = c(2L, 3L, 0L,
0L), col3 = c(0L, 3L, 2L, 4L), col4 = c(0L, 3L, 0L, 0L)),
class = "data.frame", row.names = c("1",
"2", "3", "4"))
推荐阅读
- cxf - com.ctc.wstx.exc.WstxParsingException:意外关闭标签;预期的
- javascript - 文本框不输入文本
- laravel - laravel 多态关系自定义类型
- laravel - 通过manyToMany关系获取所有关系
- command - 让我指定的角色使用命令
- r - 如何在 Y 轴 ggplot2 中标记更多断点
- java - 从正在测试的类中模拟一个单独的类函数
- html - 减少选择大小:大小调整过滤器选项
- rhel7 - HugePages 的总数从 6000 减少到 16,免费页面减少到 0
- php - Apache:如何为 .js 和 .css 文件指定缓存?