R 根据矩阵中的单元格值删除列,并消除下标越界错误
我有一个问题,我必须删除Excel文件中的某些列,这取决于使用R的某些单元格值R 根据矩阵中的单元格值删除列,并消除下标越界错误,r,loops,for-loop,matrix,R,Loops,For Loop,Matrix,我有一个问题,我必须删除Excel文件中的某些列,这取决于使用R的某些单元格值 我导入了Excel文件 data = as.matrix(read.csv('data.csv', header = FALSE)) 矩阵的维数为:dim(数据)=106474*81 我需要做什么 如果任何单元格中的值[行=1,列=i]='a'->删除列 如果任何单元格中的值[行=1,列=i]='B'->删除列 如果任何单元格中的值[行=2,列=i]>30->删除列 到目前为止我做了什么 for (i in
data = as.matrix(read.csv('data.csv', header = FALSE))
dim(数据)=106474*81
- 如果任何单元格中的值
删除列[行=1,列=i]='a'->
- 如果任何单元格中的值
删除列[行=1,列=i]='B'->
- 如果任何单元格中的值
删除列[行=2,列=i]>30->
for (i in 1:ncol(data)) {
if (data[1,i]=='A') {
data = data [,-i]
} else if (data[1,i]=='B') {
data = data [,-i]
} else if (data[2,i] > 30) {
data = data [,-i]
}
}
row2 = as.numeric(as.matrix(fly_data[2,]))
fly_data[2,] <- row2
也许你可以试试下面的代码
r <- subset(data, select = -which(as.character(unlist(data[1,]))%in% c("A","B") | as.numeric(as.character(unlist(data[2,])))>30))
数据
data <- structure(list(X1 = structure(2:1, .Names = c("r1", "r2"), .Label = c("7",
"A"), class = "factor"), X2 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("6", "D"), class = "factor"), X3 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("24", "C"), class = "factor"), X4 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("13", "A"), class = "factor"), X5 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("27", "B"), class = "factor"), X6 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("17", "A"), class = "factor"), X7 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("25", "C"), class = "factor"), X8 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("35", "C"), class = "factor"), X9 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("13", "B"), class = "factor"), X10 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("27", "B"), class = "factor")), class = "data.frame", row.names = c("r1",
"r2"))
> data
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
r1 A D C A B A C C B B
r2 7 6 24 13 27 17 25 35 13 27
数据
x1x2x3x4x5x6x7x8x9x10
r1 A D C A B A C B B
r2 7 6 24 13 27 17 35 13 27
当您阅读时,您可能会得到更多/更好的答案。您试图阅读的文件是.csv
?那么我就不会称之为“excel”文件,这只会导致混乱。至于为什么所有的值都是字符的问题:一个矩阵只能包含一种类型的值,所以如果其中任何一个值是字符串,那么整个矩阵将被转换为字符。对混合类型使用data.frame
或data.table::data.table
。然后指定for循环从1变为ncol(data)
,但是在循环中从数据中删除列
——这就是为什么下标超出范围
错误的原因。你可以先复制一份,然后对它进行变异,而不是原来的。非常感谢。成功了。1.通过使用jogo as.numeric(数据[2,i])>30 2解决了数值问题。通过使用数据的副本运行循环来解决越界问题。因此,原始矩阵运行for循环,而新矩阵正按照@dario的建议进行变异。i30);数据新
> r
X2 X3 X7
r1 D C C
r2 6 24 25
data <- structure(list(X1 = structure(2:1, .Names = c("r1", "r2"), .Label = c("7",
"A"), class = "factor"), X2 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("6", "D"), class = "factor"), X3 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("24", "C"), class = "factor"), X4 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("13", "A"), class = "factor"), X5 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("27", "B"), class = "factor"), X6 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("17", "A"), class = "factor"), X7 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("25", "C"), class = "factor"), X8 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("35", "C"), class = "factor"), X9 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("13", "B"), class = "factor"), X10 = structure(2:1, .Names = c("r1",
"r2"), .Label = c("27", "B"), class = "factor")), class = "data.frame", row.names = c("r1",
"r2"))
> data
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
r1 A D C A B A C C B B
r2 7 6 24 13 27 17 25 35 13 27