我正在尝试找到一种方法来将2个值存储在向量的一个索引中。
我有一个矩阵,我正在将其转换为矢量坐标,这样我就可以对该矢量进行随机抽样,然后将这些样本的位置转换回矩阵坐标。
filter_function<-function(df,perc){
rows<-dim(df)[1]
cols<-dim(df)[2]
vec<-vector("list",rows*cols)
for(i in 1:rows){
for(j in 1:cols){
vec[(i-1)*cols+j]<-df[i,j]
}
}
n<-rows*cols
filter<-sample(vec,n*perc)
}
我遇到的问题是函数sample
没有返回向量坐标,我也不知道如何将行和列值转换回给我。我想知道是否有另一种方法可以改变 第8行 ,看起来像这样:
vec[(i-1)*cols+j]<-c(i,j)
这显然给了我错误信息
在vec [(i - 1)* cols + j]&lt; - c(i,j):要替换的项目数 不是替换长度的倍数
所以我想知道我能做些类似的事吗?一旦我有坐标,我需要理想情况下能够快速删除这些位置中的值,所以像
df<-df[-filter]
注意:我的数据有很多重复的0和1以及介于两者之间的所有内容,因此无法采用随机样本然后使用which
或{ {1}}函数。
请帮忙!
答案 0 :(得分:0)
您可以使用unlist
df <- as.data.frame(matrix(1:25,nrow=5))
V1 V2 V3 V4 V5
1 1 6 11 16 21
2 2 7 12 17 22
3 3 8 13 18 23
4 4 9 14 19 24
5 5 10 15 20 25
unlist
将您的数据框转换为矢量。请注意,它以列方式将其列入
m <- unlist(df)
# V11 V12 V13 V14 V15 V21 V22 V23 V24 V25 V31 V32 V33 V34 V35 V41 V42 V43 V44 V45 V51 V52 V53 V54 V55
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
sample
随机索引
set.seed(1)
index <- sample(1:length(m), 1)
# 2
获取数据框中的值
R <- ifelse(index %% nrow(df) == 0, nrow(df), index %% nrow(df)) # row
C <- ifelse(index %% nrow(df) == 0, index / nrow(df), floor(index / nrow(df))+1) # column
df[R,C]
# 2
要从向量中的索引转换为数据框中的索引,请首先考虑column-index
。如果index
介于1:5之间,则值位于df
的第1列,如果介于6:10之间,则值位于df
中的第2列,等等。获得column-index
,我们可以做类似(但不完全)的事情index / number of rows in df
。为了处理提供index==2
的{{1}}等值,我想向下舍入2 / 5 = 0.4
,然后添加1.但是,当floor( 0.4 ) = 0
时,这不起作用,这给了index==multiples of 5
。因此,我使用5 / 5 = 1; floor(1) + 1 = 2
处理此问题。如果ifelse
(index is multiple of 5
)== T,则使用等式index %% nrow(df) == 0
,否则使用等式floor(index / nrow(df))+ 1。同样适用于index / nrow(df)
使用模数,row-index
返回余数。
让我们确保为每个可能的索引找到正确的行和列
%%