2013-10-02 39 views
0

我不認爲這是一個難題,但我根本無法弄清楚,也無法找到堆棧上的任何東西(希望我' m不重複)。我試圖用if/else將我的嵌套循環變成lapply語句。我有一個數據框的列表,但還沒有想出如何在嵌套for循環中訪問行。我正在使用bearingDelta列來根據軸承列值大於或小於119.9來填充1或0的新列表。此外,我意識到這個問題可能看起來與我最近發佈的問題類似,但我認爲它不同於生活。if/else語句使用lapply遍歷R中的數據框列表中的行

數據:

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 

回答

3

無需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

+1 - 也'lapply(df.list,用, as.integer(bearingDelta> = 119.9))' – flodel

+0

@ flodel我還沒有用過'with' - 會很有用,謝謝 – alexwhan

+0

很好用,非常感謝! – Misc