【问题标题】:Storing 2 values in a vector index在向量索引中存储 2 个值
【发布时间】:2017-08-07 21:52:52
【问题描述】:

我正在尝试找到一种将 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 不返回矢量坐标,而且我不知道如何将行和列值转换回给我。我想知道是否有另一种方法可以将 line 8 更改为如下所示:

vec[(i-1)*cols+j]<-c(i,j)

这显然给了我错误信息

在 vec[(i - 1) * cols + j]

所以我想知道是否有类似的事情我可以做?获得坐标后,理想情况下,我需要能够快速删除这些位置中的值,例如

df<-df[-filter]

注意:我的数据有很多重复的 0 和 1 以及介于两者之间的所有内容,因此无法随机抽取样本然后使用 whichmatch功能。

请帮忙!

【问题讨论】:

  • 而不是将它们存储在向量中,而是将它们存储在列表中..这样会更容易..我真的不知道发生了什么。如果你能提供更多的信息,也许可以帮助你。
  • df(I,j) 的含义是什么?这显然违背了 R 的语法。我怀疑 df 是否是一个函数……根据你的定义。因为你确实有dim(df)
  • 我刚刚更正了它,它应该是 df[i,j],而 df 不是一个函数..df 是一个矩阵,因此我要索引它并使用 dim(df )。这样做的目的是我想完全随机地对矩阵进行采样。 'Sample' 仅对矩阵的行或列进行采样,因此我将其转换为要从中采样的数据向量,然后我想将采样的数据转换回矩阵坐标。我想要这些坐标的原因是知道我应该删除哪些数据点,因为我需要删除它们。所有这些都在上面进行了解释。
  • @KseniaKaseyArzumanova 如果以下答案对您有用,请考虑接受它作为解决方案(左侧的复选标记)。这让社区知道它有效并且应该关闭该问题。

标签: r matrix vector


【解决方案1】:

您可以通过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 这样的值,它给出2 / 5 = 0.4,我想将floor( 0.4 ) = 0 舍入,然后加1。但是,当index==multiples of 5 给出5 / 5 = 1; floor(1) + 1 = 2 时,这不起作用。因此,我使用ifelse 来处理这个问题。如果index is multiple of 5 (index %% nrow(df) == 0) == T,则使用公式index / nrow(df),否则使用公式 floor(index / nrow(df))+1。对于使用模数 %% 返回余数的 row-index 也是如此。

双重检查

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

for (index in 1:25) {
      R <- ifelse(index %% nrow(df) == 0, nrow(df), index %% nrow(df))
      C <- ifelse(index %% nrow(df) == 0, index / nrow(df), floor(index / nrow(df))+1)
      print(df[R,C])
}

# 1
# 2
# 3
etc

【讨论】:

  • 您从未使用过变量“m”。你的意思是index &lt;- sample(1:length(m), 1) 吗?你能解释一下ifelse(index %% nrow(df) == 0, nrow(df), index %% nrow(df))吗?我对 R 还是很陌生,所以我不确定那里发生了什么。但这看起来很棒,谢谢!
  • 糟糕。进行了编辑。并将解释添加为#annotation 以回答
  • 非常感谢!我现在看到了:)
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多