我正在处理一个包含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
}
答案 0 :(得分:0)
您无需在此处使用for
或while
循环。 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-01-14创建