Оператор if/else с использованием lapply для перебора строк в списке фреймов данных в R

Я не думаю, что это сложный вопрос, но я просто не могу понять это и ничего не могу найти в стеках (надеюсь, я не дублирую). Я пытаюсь изменить свои вложенные циклы for на операторы lapply, используя if/else. У меня есть список фреймов данных, но я не понял, как получить доступ к строкам, как я могу во вложенных циклах 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

person Misc    schedule 02.10.2013    source источник


Ответы (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
person alexwhan    schedule 02.10.2013
comment
+1 - также lapply(df.list, with, as.integer(bearingDelta >= 119.9)) - person flodel; 03.10.2013
comment
@flodel Я не использовал with так - будет полезно, спасибо - person alexwhan; 03.10.2013
comment
И если вы по какой-то причине хотите сохранить 8 нажатий клавиш: lapply(df.list, function(x) (x$bearingDelta >= 119.9)*1) - person Henrik; 03.10.2013