【问题标题】:What is wrong with this looping?这个循环有什么问题?
【发布时间】:2013-03-13 13:01:16
【问题描述】:

我无法理解这个 R 代码有什么问题,我有几行和一个带有测量值或 NA 的列,我基本上想在这几个列中查找每行的最小值和最大值:

require(plyr)

census <- read.csv("sps_census.csv")
info <- read.csv("sps_info.csv")


for (i in 1: nrow(census)) {
  trans <- census[i,c("dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8", "dbh9")]
  index.1 <- which (trans != "NA") #some NAs are in the data
  census$min.dbh <- min(trans[1,index.1])
  census$min.dbh.index <- min(index.1)
  census$max.dbh <- max(trans[1,index.1])
  census$max.dbh.index  <- max(index.1)
}

【问题讨论】:

  • 如果您用您正在使用的语言名称标记您的问题,您会更容易获得答案。
  • 您收到哪条错误消息?
  • 我认为他得到了错误的结果。
  • 据我所知,我得到了一个“永恒的循环”。
  • 你可以直接使用min(dataitem,na.rm=TRUE),省去很多麻烦。

标签: r loops if-statement indexing


【解决方案1】:

你可以使用apply:

index <- c"dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8", "dbh9") #or paste("dbh",1:9,sep="")

census$min.dbh <- apply(census[index], 1, min, na.rm=T)
census$min.db.index <- apply(census[index], 1, function(x){ min(which(!is.na(x))) })
census$max.dbh <- apply(census[index], 1, max, na.rm=T)
census$max.db.index <- apply(census[index], 1, function(x){ max(which(!is.na(x))) })

请注意,我使用的是is.na(x) 而不是x != "NA"

【讨论】:

  • Package matrixStats 有函数rowMinsrowMaxs(以及许多类似的有用函数),在这里很方便。
【解决方案2】:

在这一行(以及其他三个类似的行):

census$min.dbh <- min(trans[1,index.1])

您将整个列分配给所有相同的值。显然不是你想要的。

也许你想要这样的东西:

census$min.dbh[i] <- min(trans[1,index.1])

请注意,您可以使用apply 来执行此类操作。如果您提供示例数据(即,让您的问题成为可重复的示例),那么某人编写一个有效的 apply 示例会容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多