【问题标题】:Elementary problems with a Loop in RR中循环的基本问题
【发布时间】:2020-03-23 21:47:21
【问题描述】:

我正在使用 R 中的 for 循环;

我有一个包含 n 列的数据框。

我必须构建一个长度为 n 的向量,如果列是双精度,则每个元素为 1,否则为 0。

这是我尝试过的:

y<-rep(0,dim.data.frame(datafr)[2])
attach(datafr)
x<-names(dat)
for (j in 1:length(x)){
  for(i in x){
    if(is.double(i)){
      y[j]<-1
    }else{
      y[j]<-0
    }
  }
}

但是,它不起作用,因为返回的 y 向量没有 1,而只有 n 0。

【问题讨论】:

  • sapply(datafr, is.double) 会给你一个向量,每列匹配。在 R data.frames 中,一列通常是一个类(numericintegercharacter),因此每列无需检查多个值。
  • 你知道 SO 的网络礼仪建议提问者应该[“接受”最佳答案]((stackoverflow.com/help/someone-answers))?这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)(也请接受您的previous questions。)

标签: r dataframe for-loop


【解决方案1】:
  1. data.frame 中的列都应该是同一个类,因此您只需检查列中的第一个值。

  2. 一种简单的方法是使用sapply 创建向量,该向量循环(在这种情况下)帧的列。

    datafr <- data.frame(a=1:5, b=1:5 + 0, d=letters[1:5])
    sapply(datafr, is.double)
    #     a     b     d 
    # FALSE  TRUE FALSE 
    
  3. 如果您必须使用for 循环,则可以使用

    y <- integer(ncol(datafr)) # defaults to 0
    y
    # [1] 0 0 0
    for (j in seq_along(datafr)) {
      if (is.double(datafr[[j]])) {
        y[j] <- 1L
      }
    }
    y
    # [1] 0 1 0
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多