繁体   English   中英

使用seq_along()处理空情况

[英]using seq_along() to handle the empty case

我读到,使用seq_along()可以更好地处理空情况,但是在我看来,这个概念并不十分清楚。

例如,我有以下数据框:

df
            a            b          c          d
1   1.2767671  0.133558438  1.5582137  0.6049921
2  -1.2133819 -0.595845408 -0.9492494 -0.9633872
3   0.4512179  0.425949910  0.1529301 -0.3012190
4   1.4945791  0.211932487 -1.2051334  0.1218442
5   2.0102918  0.135363711  0.2808456  1.1293810
6   1.0827021  0.290615747  2.5339719 -0.3265962
7  -0.1107592 -2.762735937 -0.2428827 -0.3340126
8   0.3439831  0.323193841  0.9623515 -0.1099747
9   0.3794022 -1.306189542  0.6185657  0.5889456
10  1.2966537 -0.004927108 -1.3796625 -1.1577800

考虑以下三个不同的代码段:

# Case 1
for (i in 1:ncol(df)) {
    print(median(df[[i]]))
}

# Case 2
for (i in seq_along(df)) {
    print(median(df[[i]]))
}

# Case 3
for(i in df) print(median(i))

当存在完整的data.frame或存在空的data.frame时,这些不同过程之间有什么区别?

df <- data.frame()的条件下,我们有:

案例1成为...的受害者

.subset2(x,i,精确=精确)中的错误:下标超出范围

情况2和情况3 触发。

本质上, 案例1中的错误是由于ncol(df)0所致。 这将导致序列1:ncol(df)1:0 ,从而创建向量c(1,0) 在这种情况下, for循环尝试访问向量1的第一个元素,而试图访问列1的元素存在。 因此,发现该子集超出范围。

同时,在情况2和3for由于向量为空,因此在它们各自的集合内没有要处理的元素,因此永远不会执行for循环。 原则上,这意味着它们的长度为0

由于这个问题与seq_along()到底发生了什么有关, seq_along() ,我们通过构造一个完整的向量a并查看结果seq_along举一个传统的seq_along示例:

set.seed(111)
a <- runif(5)
seq_along(a)
#[1] 1 2 3 4 5

实质上,对于向量a每个元素,都有一个由seq_along创建的要访问的对应索引。

如果在上述情况下现在将seq_along应用于空df ,我们将得到:

seq_along(df)
# integer(0)

因此,创建的是零长度向量。 沿零长度向量移动非常困难。

如此, 案例1 不能很好地保护 空的案例

现在,在传统的假设下, data.frame存在一些数据,对于任何类型的开发人员data.frame ,这都是一个非常糟糕的假设。

set.seed(1234)
df <- data.frame(matrix(rnorm(40), 4))

所有这三种情况将按预期运行。 也就是说,您将在data.frame每列中收到一个中位数。

[1] -0.5555419
[1] -0.4941011
[1] -0.4656169
[1] -0.605349 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM