gpt4 book ai didi

r - 使用 seq_along() 处理空情况

转载 作者:行者123 更新时间:2023-12-03 23:19:23 26 4
gpt4 key购买 nike

我读到使用 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 成为……的牺牲品

Error in .subset2(x, i, exact = exact) : subscript out of bounds



案例 2 和案例 3 不会被触发。

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

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

因为这个问题特别涉及 seq_along() 到底发生了什么事情,我们来个传统的 seq_along构建完整向量的示例 a并查看结果:
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 中有一些数据。 ,对于任何类型的开发人员来说,这是一个非常糟糕的假设......
set.seed(1234)
df <- data.frame(matrix(rnorm(40), 4))

所有三个案例都将按预期运行。也就是说,您将收到 data.frame 的每列中值。 .
[1] -0.5555419
[1] -0.4941011
[1] -0.4656169
[1] -0.605349

关于r - 使用 seq_along() 处理空情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com