2016-11-10 47 views
1

我有列表中的data.frame對象作爲自定義函數的輸出,我打算繼續重複刪除只有第一個data.frame對象,而其他人不應受影響。我試着用lapply函數來控制這個約束,但我有下標錯誤。我知道這更容易分開做,但這不是我想要的。任何人都可以指出我如何在函數式編程中使這更簡單嗎?有誰知道控制列表中的特定對象的約束的任何有用的技巧?如何更優雅地限制列表中特定data.frame的重複刪除?

迷你例如:

myList <- list(
    bar = data.frame(v1=c(12,21,37,21,37), v2=c(14,29,45,29,45)), 
    cat = data.frame(v1=c(18,42,18,42,81), v2=c(27,46,27,46,114)), 
    foo = data.frame(v1=c(3,3,33,3,33,91), v2=c(26,26,42,26,42,107)) 
) 

很容易這樣做:

.first <- unique(myList[[1L]]) 
res <- c(list(.first), myList[- 1L]) 

,但我需要限制重複去除僅在第一data.frame效果,而另一些不做刪除重複,我打算以功能更優雅的方式實現這一點。

所需的輸出:

myOutput <- list(
    bar = data.frame(v1=c(12,21,37),v2=c(14,29,45)), 
    cat = data.frame(v1=c(18,42,18,42,81), v2=c(27,46,27,46,114)), 
    foo = data.frame(v1=c(3,3,33,3,33,91), v2=c(26,26,42,26,42,107)) 
) 
+1

爲什麼不能更新'myList [[1]] < - unique(myList [[1]])或循環遍歷序列lapply(seq_along(myList),function(i)if(i = = 1)unique(myList [[i]])else myList [[i]]) – akrun

+0

更新我的評論 – akrun

+1

謝謝,更新這個答案,upvote你的解決方案。 –

回答

2

如果我們需要使用lapply,那麼我們就可以遍歷的list序列,並與if/else修改list元素

lapply(seq_along(myList), function(i) if(i==1) unique(myList[[i]]) else myList[[i]]) 

要不然我們可以指定修改後的list元素

myList[[1]] <- unique(myList[[1]])