【问题标题】:How might I generalize this code to fit larger sets of data?我如何概括此代码以适应更大的数据集?
【发布时间】:2019-08-22 22:17:10
【问题描述】:

我想扩展我编写的代码的可用性。更好的是,我想概括一下以备将来使用。

我正在使用 Rstudio。我已经重新编码了一个 100 维向量。值 1-10 已转换为恒等向量。例如,所有 1 的值现在都是向量,读取为 1 0 0 0 0 0 0 0 0 0,所有 2 的值现在读取为 0 1 0 0 0 0 0 0 0 0,依此类推。代码如下:

tens <- seq(from=1, to=10, by=1)
y <- sample(tens, size=100, replace=TRUE)
y
num.its <- 100
Y <- rep(0,num.its*10)
dim(Y) <- c(num.its,10)
I <- diag(10)
for(i in 1:100){
  if(y[i]==1){
    Y[i,] <- I[1,]
  } else if (y[i]==2){
    Y[i,] <- I[2,]
  } else if (y[i]==3){
    Y[i,] <- I[3,]
  } else if (y[i]==4){
    Y[i,] <- I[4,]
  } else if (y[i]==5){
    Y[i,] <- I[5,]
  } else if (y[i]==6){
    Y[i,] <- I[6,]
  } else if (y[i]==7){
    Y[i,] <- I[7,]
  } else if (y[i]==8){
    Y[i,] <- I[8,]
  } else if (y[i]==9){
    Y[i,] <- I[9,]
  } else {
    Y[i,] <- I[10,]
  }
}

代码按计划运行。但是,如果我必须重新编码 1-2000 的值,那么我宁愿不写 2000 else if 语句。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • Y[i,] = I[min(y[i],10),]?也就是说,如果y[i]&gt;0 在所有情况下
  • 感谢您的回复。我想要概括的是我可以拥有的 y 的不同值的数量。在这种特定情况下,我有 10 个不同的可能值要重新编码,但在另一种情况下,我可能有 100 或 200 个。谢谢
  • Y[i,] = I[y[i],] 就是你要找的东西
  • 请注意 min 是复制代码行为所必需的,因为您使用 else 而不是 else if 作为最后一个条件,但您可以在此处将 10 提高到任意数字
  • @OganM y 中只有 10 个值,即 1:10 如果除了 1:10 之外还有其他值,那么 min 将被认为是必要的

标签: r for-loop if-statement


【解决方案1】:

一个相当不错的单线如下:

# sample data
set.seed(1234)
x <- c(1:5, sample(10L, 6))

我们的向量是

x
 [1]  1  2  3  4  5 10  6  5  4  1  8

然后,将 x 转换为因子变量,指定所需的级别,并使用 model.matrix 获取所需向量的矩阵。

model.matrix(~ . + 0, data.frame(x=factor(x, levels=1:10)))

返回

   x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
1   1  0  0  0  0  0  0  0  0   0
2   0  1  0  0  0  0  0  0  0   0
3   0  0  1  0  0  0  0  0  0   0
4   0  0  0  1  0  0  0  0  0   0
5   0  0  0  0  1  0  0  0  0   0
6   0  0  0  0  0  0  0  0  0   1
7   0  0  0  0  0  1  0  0  0   0
8   0  0  0  0  1  0  0  0  0   0
9   0  0  0  1  0  0  0  0  0   0
10  1  0  0  0  0  0  0  0  0   0
11  0  0  0  0  0  0  0  1  0   0
attr(,"assign")
 [1] 1 1 1 1 1 1 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$x
[1] "contr.treatment"

在这里,行代表您想要的。如果需要,您可以使用t 将其转换为列。另请注意,即使 x 中缺少 7,该列仍存在于矩阵中。

【讨论】:

    【解决方案2】:

    你可以使用dummy包中的函数dummy

    dummy::dummy(data.frame(x=factor(x)))
       x_1 x_2 x_3 x_4 x_5 x_6 x_8 x_9
    1    1   0   0   0   0   0   0   0
    2    0   1   0   0   0   0   0   0
    3    0   0   1   0   0   0   0   0
    4    0   0   0   1   0   0   0   0
    5    0   0   0   0   1   0   0   0
    6    0   1   0   0   0   0   0   0
    7    0   0   0   0   0   1   0   0
    8    0   0   0   0   1   0   0   0
    9    0   0   0   0   0   0   1   0
    10   0   0   0   0   0   0   0   1
    11   0   0   0   1   0   0   0   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多