【问题标题】:if/else statement using lapply to iterate through rows in list of data frames in Rif/else 语句使用 lapply 遍历 R 中数据帧列表中的行
【发布时间】:2013-10-02 23:14:02
【问题描述】:

我认为这不是一个难题,但我根本无法弄清楚这一点,并且在堆栈上找不到任何东西(希望我没有重复)。我正在尝试使用 if/else 将嵌套的 for 循环更改为 lapply 语句。我有一个数据框列表,但还没有弄清楚如何像在嵌套的 for 循环中那样访问行。我正在使用bearingDelta 列来填充一个新列表,其中的值是1 或0,具体取决于bearingDelta 列的值是大于还是小于119.9。另外,我意识到这个问题可能看起来与我最近发布的一个问题相似,但我认为它已经足够不同了。

数据:

lat <- c(32.87707, 32.87708, 32.87694, 32.87726, 32.87469)
lon <- c(-117.2386, -117.2334, -117.2378, -117.2356, -117.2329)
bearingDelta <- c(180, 49, 23, 119, 129)
df <- data.frame(cbind(bearingDelta, lat, lon))
df.list <- list(df, df, df, df)

嵌套循环:

over120 <- list()
for (i in 1:length(tripList)) {
  for (j in 1:nrow(tripList[[i]])) {
 if (tripList[[i]][j, c("bearingDelta")] <= 119.9) {
   over120[[i]][j] <- 0 }
 else {
   over120[[i]][j] <- 1 }
  }
}

lapply(这是我想要达到的目的)。

over120 <- lapply(tripList, if (tripList[[i]][j, c("bearingDelta")] <= 119.9)     over120[[i]][j] <- 0 
   else over120[[i]][j] <- 1)

此示例数据集的所需输出如下所示:

> over120
[[1]]
[1] 1  0  0  0  1

[[2]]
[1] 1  0  0  0  1

[[3]]
[1] 1  0  0  0  1

[[4]]
[1] 1  0  0  0  1

【问题讨论】:

    标签: r if-statement nested-loops lapply


    【解决方案1】:

    不需要if

    lapply(df.list, function(x) as.integer(x$bearingDelta >= 119.9))
    # [[1]]
    # [1] 1 0 0 0 1
    # 
    # [[2]]
    # [1] 1 0 0 0 1
    # 
    # [[3]]
    # [1] 1 0 0 0 1
    # 
    # [[4]]
    # [1] 1 0 0 0 1
    

    【讨论】:

    • +1 - 还有lapply(df.list, with, as.integer(bearingDelta &gt;= 119.9))
    • @flodel 我没有像那样使用过with - 会有用的,谢谢
    • 如果你出于某种原因热衷于保存 8 个击键:lapply(df.list, function(x) (x$bearingDelta &gt;= 119.9)*1)
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多