【问题标题】:R create vector with a for and while loopR 使用 for 和 while 循环创建向量
【发布时间】:2015-11-23 20:27:16
【问题描述】:

早上好, 我有以下问题。 我的 Data.frame “数据”具有以下格式:

Type    amount
1       2
2       0
3       3

我想创建一个格式如下的向量:

1
1
3
3
3

这意味着我想转换我的数据。 我创建了一个向量并为我在 R 中的转换编写了以下代码:

向量

for (i in 1:3){
     k <- 1
     while (k <= data[i,2]){
         vector[k] <- data[i,1]
         k <- k+1
 }
 }

问题是,我得到以下结果,但我不知道我错在哪一部分……

3
3
3
0
0

在 R 中解决这个特定问题可能有很多不同的方法,但我很好奇为什么我的解决方案不起作用。我很感谢其他选择,但真的很想知道我的错误是什么。 感谢您的帮助!

【问题讨论】:

  • 如果您要使用 for/while 解决方案,您需要为向量保留一个单独的索引,现在您将使用不同的值多次设置 vector[1]
  • 可能是stack(unlist(apply(data, 1, function(x) rep(x['Type'], x['amount']))))
  • @VeerendraGadekar 只需 with(data, rep(Type, amount)) 就可以,但我认为 OP 想要使用 while/for 循环
  • @VeerendraGadekar 也许复制/粘贴rep 的源代码就足够了。
  • 带有(data…) 的建议解决方案对我来说非常完美。我仍然只是想知道为什么我最初的尝试不起作用。我确实使用了 vector[k] 的单独索引,或者我在这里出错了。感谢您的所有帮助!

标签: r loops for-loop vector while-loop


【解决方案1】:

试试这个解决方案:

df <- data.frame(type = c(1, 2, 3), amount = c(2, 0, 3))
result <- unlist(mapply(function(x, y) rep.int(x, y), df[, "type"], df[, "amount"]))
result

输出如下:

# [1] 1 1 3 3 3

您的代码确实有问题。正确的代码应如下所示:

df <- data.frame(type = c(1, 2, 3), amount = c(2, 0, 3))
vector <- numeric(5)
k <- 1
for (i in 1:3) {
    j <- 1
    while (j <= df[i, 2]) {
        vector[k] <- df[i, 1]
        k <- k + 1
        j <- j + 1
    }
}
vector
# [1] 1 1 3 3 3

【讨论】:

  • 感谢您的意见!现在我明白了我的错误,并且可以使用不同的版本!
【解决方案2】:

可能是获得此结果的最快和最优雅的方式之前已在@akrun 的评论中发布:

with(data, rep(Type, amount))
[1] 1 1 3 3 3

但是,如果您想使用 for/while 循环执行此操作,则在开始时不知道条目数的情况下使用列表可能会有所帮助。

这是一个对您的代码进行了最少修改的示例:

my_list <- vector("list", 3)
for (i in 1:3) {
  k <- 1
  while (k <= data[i,2]){
    my_list[[i]][k] <- data[i,1]
    k <- k + 1
  }
}
vector <- unlist(my_list)
#> vector
#[1] 1 1 3 3 3

您的代码不起作用的原因本质上是您试图将太多信息放入单个变量k。它不能同时用作输出向量的索引,也不能用作data 第一列中各个条目的计数器;每次while 循环完成时重置为1 的计数器。

【讨论】:

  • 另一个包装器是expandRows(data, 'amount'),来自library(splitstackshape)
  • 非常感谢!这是信息的缺失部分! @akrun:感谢您提供解决此问题的简单方法以及您的持续输入!
  • @akrun 人们有时会投反对票,这真是令人惊讶。你的解决方案很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2011-12-15
  • 2019-04-30
  • 2016-06-25
相关资源
最近更新 更多