在向量索引中存储2个值

时间:2017-08-07 21:52:53

标签: r matrix vector

我正在尝试找到一种方法来将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}}函数。

请帮忙!

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

更详细地看看上面的ifelse语句

要从向量中的索引转换为数据框中的索引,请首先考虑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处理此问题。如果ifelseindex is multiple of 5)== T,则使用等式index %% nrow(df) == 0,否则使用等式floor(index / nrow(df))+ 1。同样适用于index / nrow(df)使用模数,row-index返回余数。

仔细检查

让我们确保为每个可能的索引找到正确的行和列

%%
相关问题