【问题标题】:Trying to learn how to use the "for" loop尝试学习如何使用“for”循环
【发布时间】:2016-09-16 07:42:44
【问题描述】:

所以我有这个子集:

Sbset<-cbind(v1,v2,v3,v4,...vn)

我想做:

ifelse(vi==9,NA,vi) for every vi, i=1,...,n

我想学习使用 for 循环来做到这一点(我知道我可以用其他方式做到这一点)。

所以我尝试了:

V<-colnames(Sbset)

for(i in seq_along(V)){
ifelse(Sbset[, Sbset[i]]==9,NA,Sbset[i])
}

但是,它什么也没做。 所以我知道我不了解如何使用 for 逻辑。 请你帮助我好吗 ? 谢谢你:)

【问题讨论】:

  • Sbset[, Sbset[i]] 不是列,因为 Sbset[i] 不是列的名称。你需要names(Sbset)[i]。以后会有类似的变化。
  • 一旦你知道如何使用for循环方法,你可以看看R提供的更简单的方法,例如在这种情况下你可以只做is.na(Sbset) &lt;- Sbset == 9
  • 这不是 R 特定的问题。

标签: r if-statement for-loop subset


【解决方案1】:

创建数据集

v1 <- sample(10,5)
v2 <- sample(10,5)
v3 <- sample(10,5)
v4 <- sample(10,5)
Sbset <-cbind(v1,v2,v3,v4)
Sbset
#     v1 v2 v3 v4
#[1,]  8  1  6  4
#[2,]  7  7  4  1
#[3,]  3  6  5  2
#[4,]  5  5  3  5
#[5,] 10  9  9  7

使用循环

for (i in 1:ncol(Sbset)){
    Sbset[,i] <- ifelse(Sbset[,i]==9,NA,Sbset[,i])
}
Sbset
#      v1 v2 v3 v4
# [1,]  8  1  6  4
# [2,]  7  7  4  1
# [3,]  3  6  5  2
# [4,]  5  5  3  5
# [5,] 10 NA NA  7

但最好不要使用循环

Sbsetpaul <-cbind(v1,v2,v3,v4) # Recreate the dataset
Sbsetpaul[Sbsetpaul == 9] <- NA

甚至像@Frank 所建议的那样

Sbsetfrank <-cbind(v1,v2,v3,v4) # Recreate the dataset
is.na(Sbsetfrank) <- Sbsetfrank == 9

【讨论】:

  • 非常好的答案。我怎样才能使变量本身被修改?所以当我在摘要(vi)中查看它们时,我看到没有 9,只有 NA 在他们的位置?
  • Sbset 是一个矩阵。您可以使用v1 &lt;- Sbset[,1] 将矩阵的第一列重新分配给向量v1,然后您将在summary(v1) 中看到NA。但通常很多向量都保存在一个数据框中:Sbsetnicolas &lt;- data.frame(Sbset)。然后使用$ 访问列。 summary(Sbsetnicolas$v1).
猜你喜欢
  • 2013-02-27
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多