【问题标题】:While Loop Of Large Dataset Printing Incorrect Results大数据集循环打印不正确的结果
【发布时间】:2019-01-15 11:01:20
【问题描述】:

我正在处理一个包含 2132 个值的大型数据集,其中包含两列,一列表示客户的开始日期,另一列表示结束日期。

我目前正在使用 while 循环来遍历我的数据集。如果客户的结束日期是 NA,它会将“NA”添加到向量 s。如果结束日期大于开始日期,则将两者相减并将该数字添加到 s。最后,如果开始日期和结束日期相等,则将向量 s 加 1。

向量 s 中我应该拥有的前几个值是:NA, 1,1,NA,2,1,2。

然而,我的 while 循环当前正在返回:1, NA, 1, 1, NA,1,1。

我的 while 循环逻辑有什么问题?

我的数据集的前几个值是:

a(first)  b(last)
2         NA
3         3
3         3
4         NA
4         5
2         2
2         3

我的代码如下:

x <- 1
while (x <= 2132)
{
  if (is.na(b[x])) 
  {
     s <- c(s,'NA')
  }
  else if(a[x] < b[x])
  {
     s <- c(s,(b[x] - a[x]) + 1)
  }
  else if (a[x] == b[x])
  {
     s <- c(s,1)
  }
  x = x + 1
}   

【问题讨论】:

  • 假设您将s 初始化为空的numericcharacter,循环产生s 值为[1] NA 1 1 NA 2 1 2(使用x &lt;= length(b)
  • 忘记将 s 初始化为空向量。谢谢!!

标签: r while-loop


【解决方案1】:

您不需要在此处使用forwhile 循环。 R 编程的一个核心租户是向量化的概念。

简而言之,您可以一次实现所有逻辑。为此,我将使用两个 ifelse() 函数:

d <- data.frame(a = c(2,3,3,4,4,2,2), b = c(NA, 3,3,NA,5,2,3))
d$s <- with(d, ifelse(is.na(b), NA, ifelse(b > a, b -a + 1, 1)))
d
#>   a  b  s
#> 1 2 NA NA
#> 2 3  3  1
#> 3 3  3  1
#> 4 4 NA NA
#> 5 4  5  2
#> 6 2  2  1
#> 7 2  3  2

reprex package (v0.2.1) 于 2019 年 1 月 14 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2021-12-18
    • 2020-03-22
    • 2015-11-28
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多