R 删除多个条件下的矩阵行

R 删除多个条件下的矩阵行,r,for-loop,if-statement,conditional-statements,subset,R,For Loop,If Statement,Conditional Statements,Subset,这个问题最好通过例子来解决 设置 那么我想要的输出是: output <- data.frame(rbind(Mat1[2,1:6], Mat1[5:9,1:6])) output Name Strategy.Assets Jan.94 Jan.95 Jan.96 Jan.97 1 b 30 -0.231467724347497 1.362093373

这个问题最好通过例子来解决

设置

那么我想要的输出是:

output <- data.frame(rbind(Mat1[2,1:6], Mat1[5:9,1:6]))
output

  Name Strategy.Assets             Jan.94             Jan.95             Jan.96              Jan.97
1    b              30 -0.231467724347497   1.36209337396348  0.244352997300369   0.147019042483708
2    e              60  0.818447801042692 -0.767858384307916  -1.23187047713004 -0.0779863946287645
3    f              30 -0.231572883434978  0.266559660007751  0.720829574412722 -0.0207732265889516
4    g              30  0.444651868913969  0.832322051653509 -0.538333881677844   0.291130047037627
5    h              40   2.00827324376109  0.775006479679076 0.0323592399331455   -2.33121256833447
6    i              50 -0.368493048065977   1.30727697822673 -0.446402751994181 -0.0616057412430855


output如果我理解正确,一种方法是首先使用
which
找出相关列的行和列索引,其中值大于等于0.95。对于每一行和每一列对,我们找出相应的最小值,并从原始
Mat1
中删除该行

mat <- which(Mat1[, as.character(1:5)] >= 0.95, arr.ind = TRUE)
Mat1[-unique(apply(mat, 1, function(x) x[which.min(Mat1$Strategy.Assets[x])])), ]


#  Name Strategy.Assets      Jan.94      Jan.95     Jan.96     Jan.97 1   2   3    4    5
#2    b              30 -0.02101158  1.27504998 -0.9534582 -0.6917499 0 0.8 0.6 0.09 0.01
#5    e              60 -0.88500700 -1.19165574 -1.6309657  0.6183648 0 0.0 0.0 0.00 0.80
#6    f              30 -0.45072999 -0.04698659  0.7462178  0.5858741 0 0.0 0.0 0.00 0.00
#7    g              30  1.29131284 -1.60004027 -0.9681269  0.9595044 0 0.0 0.0 0.00 0.00
#8    h              40  0.37883959 -1.11536574 -0.3041997 -0.8202406 0 0.0 0.0 0.00 0.00
#9    i              50  1.50068308  0.89465888  0.6646096  0.4433313 0 0.0 0.0 0.00 0.00
mat=0.95,arr.ind=TRUE)
Mat1[-唯一(应用(mat,1,函数(x)x[which.min(Mat1$Strategy.Assets[x])),]
#名称策略。资产1994年1月95年1月96年1月97年1月1 2 3 4 5
#2 b 30-0.02101158 1.27504998-0.9534582-0.6917499 0.80.6 0.09 0.01
#5 e 60-0.88500700-1.19165574-1.6309657 0.6183648 0.0 0.0 0.00 0.80
#6 f 30-0.45072999-0.04698659 0.7462178 0.5858741 0.0 0.0 0.00 0.00
#7 g 30 1.29131284-1.6000427-0.9681269 0.9595044 0.0 0.0 0.00 0.00
#8小时40 0.37883959-1.11536574-0.3041997-0.8202406 0.0 0.0.00 0.00
#9 i 50 1.50068308 0.89465888 0.6646096 0.4433313 0.0 0 0.0 0.00 0.00
数据

Mat1 <- data.frame(matrix(nrow =9, ncol =11))
colnames(Mat1) <- c("Name", "Strategy.Assets", "Jan.94", "Jan.95", "Jan.96", 
                 "Jan.97", "1", "2", "3","4", "5")

Mat1[,1] <- letters[1:9]
Mat1[,2] <- c(20,30,40,50,60,30,30,40,50)
Mat1[,3:6] <- rnorm(36,0,1)
Mat1[,7] <- c(0,0,0,0,0,0,0,0,0)
Mat1[,8] <- c(0.95, 0.8, 0,0,0,0,0,0,0)
Mat1[,9] <- c(0.95,0.6,0.7,0,0,0,0,0,0)
Mat1[,10] <- c(0.08, 0.09, 0.99, 0.93, 0,0,0,0,0)
Mat1[,11] <- c(0.09,0.01,0.04,0.97, 0.80,0,0,0,0)

Mat1如果我理解正确,一种方法是首先使用
which
找出相关列的行和列索引,其中值大于等于0.95。对于每一行和每一列对,我们找出相应的最小值,并从原始
Mat1
中删除该行

mat <- which(Mat1[, as.character(1:5)] >= 0.95, arr.ind = TRUE)
Mat1[-unique(apply(mat, 1, function(x) x[which.min(Mat1$Strategy.Assets[x])])), ]


#  Name Strategy.Assets      Jan.94      Jan.95     Jan.96     Jan.97 1   2   3    4    5
#2    b              30 -0.02101158  1.27504998 -0.9534582 -0.6917499 0 0.8 0.6 0.09 0.01
#5    e              60 -0.88500700 -1.19165574 -1.6309657  0.6183648 0 0.0 0.0 0.00 0.80
#6    f              30 -0.45072999 -0.04698659  0.7462178  0.5858741 0 0.0 0.0 0.00 0.00
#7    g              30  1.29131284 -1.60004027 -0.9681269  0.9595044 0 0.0 0.0 0.00 0.00
#8    h              40  0.37883959 -1.11536574 -0.3041997 -0.8202406 0 0.0 0.0 0.00 0.00
#9    i              50  1.50068308  0.89465888  0.6646096  0.4433313 0 0.0 0.0 0.00 0.00
mat=0.95,arr.ind=TRUE)
Mat1[-唯一(应用(mat,1,函数(x)x[which.min(Mat1$Strategy.Assets[x])),]
#名称策略。资产1994年1月95年1月96年1月97年1月1 2 3 4 5
#2 b 30-0.02101158 1.27504998-0.9534582-0.6917499 0.80.6 0.09 0.01
#5 e 60-0.88500700-1.19165574-1.6309657 0.6183648 0.0 0.0 0.00 0.80
#6 f 30-0.45072999-0.04698659 0.7462178 0.5858741 0.0 0.0 0.00 0.00
#7 g 30 1.29131284-1.6000427-0.9681269 0.9595044 0.0 0.0 0.00 0.00
#8小时40 0.37883959-1.11536574-0.3041997-0.8202406 0.0 0.0.00 0.00
#9 i 50 1.50068308 0.89465888 0.6646096 0.4433313 0.0 0 0.0 0.00 0.00
数据

Mat1 <- data.frame(matrix(nrow =9, ncol =11))
colnames(Mat1) <- c("Name", "Strategy.Assets", "Jan.94", "Jan.95", "Jan.96", 
                 "Jan.97", "1", "2", "3","4", "5")

Mat1[,1] <- letters[1:9]
Mat1[,2] <- c(20,30,40,50,60,30,30,40,50)
Mat1[,3:6] <- rnorm(36,0,1)
Mat1[,7] <- c(0,0,0,0,0,0,0,0,0)
Mat1[,8] <- c(0.95, 0.8, 0,0,0,0,0,0,0)
Mat1[,9] <- c(0.95,0.6,0.7,0,0,0,0,0,0)
Mat1[,10] <- c(0.08, 0.09, 0.99, 0.93, 0,0,0,0,0)
Mat1[,11] <- c(0.09,0.01,0.04,0.97, 0.80,0,0,0,0)

Mat1在矩阵中保存数据时,由于
Name
列的原因,矩阵中的所有值都转换为字符。您想将其保留为矩阵还是将其转换为数据帧?此外,在本示例中,仅删除了一行。您可以添加一个更详细的示例,其中删除了多行,以便更容易理解。为什么要使用矩阵?查看各种类型的变量,在我看来,
data.frame
data.table
tibble
更合适……一秒钟。我将把它设为data.frame并扩展示例。我现在还在学习R。”然后我需要转到“战略资产”专栏,比较1和2的值(在本例中为20和30)。“我不太明白你的意思:战略资产的1和2的值是什么?列
1
2
没有20和30,如果我过滤
2
>=0.95的数据,我只得到strategy.assets等于20@PavoDive编辑。这意味着在“战略资产”列的“第1行和第2行”中读取,因为您将数据保存在矩阵中,因为
Name
column,所以矩阵中的所有值都转换为字符。您想将其保留为矩阵还是将其转换为数据帧?此外,在本示例中,仅删除了一行。您可以添加一个更详细的示例,其中删除了多行,以便更容易理解。为什么要使用矩阵?查看各种类型的变量,在我看来,
data.frame
data.table
tibble
更合适……一秒钟。我将把它设为data.frame并扩展示例。我现在还在学习R。”然后我需要转到“战略资产”专栏,比较1和2的值(在本例中为20和30)。“我不太明白你的意思:战略资产的1和2的值是什么?列
1
2
没有20和30,如果我过滤
2
>=0.95的数据,我只得到strategy.assets等于20@PavoDive编辑。它的意思是阅读“战略资产”一栏的“第1行和第2行”,这是一个了不起的家伙!非常感谢。稍后我会将此标记为答案(其他人可能有其他想法)。但我现在可以用这个了!谢谢,伙计,这太棒了!非常感谢。稍后我会将此标记为答案(其他人可能有其他想法)。但我现在可以用这个了!谢谢,伙计