2012-08-30 15 views
0

所以我有一堆列表對象中的數據幀。框架被組織如有條件的樂子

ID  Category Value 
2323 Friend  23.40 
3434 Foe   -4.00 

而且我讓他們到一個列表按照this topic。我也可以在this topic中顯示簡單的函數。

現在我試圖運行一個條件函數與lapply,我遇到了麻煩。在某些表中,'ID'列有不同的名稱(比如'recnum'),我需要告訴lapply檢查每個數據框,檢查是否有名爲'recnum'的列,並將其名稱更改爲' ID',如在

colnr <- which(names(x) == "recnum" 
if (length(colnr > 0)) {names(x)[colnr] <- "ID"} 

但我遇到了與本地範圍的麻煩,誰知道什麼。有任何想法嗎?

+1

最小重複的例子,請 - 你的標題和正文談lapply,但你的代碼例子沒有。 http://stackoverflow.com/a/5965451/334485 – themel

回答

1

如果看一下mnel答案的第二部分,可以看到函數foox評估爲最後一個表達式。否則,如果您嘗試直接從傳遞給lapply的匿名函數內更改列表中的data.frames名稱,則該名稱可能無效。

只是作爲替代,你可以使用gsub和避免加載額外的包(雖然plyr是一個很好的封裝):

xx <- list(data.frame("recnum" = 1:3, "recnum2" = 1:3), 
    data.frame("ID" = 4:6, "hat" = 4:6)) 

lapply(xx, function(x){ 
    names(x) <- gsub("^recnum$", "ID", names(x)) 
    return(x) 
}) 
# [[1]] 
# ID recnum2 
# 1 1  1 
# 2 2  2 
# 3 3  3 

# [[2]] 
# ID hat 
# 1 4 4 
# 2 5 5 
# 3 6 6 
3

使用rename功能plyr;它重命名的名字,而不是現在的位置:

x <- data.frame(ID = 1:2,z=1:2) 
y <- data.frame('recnum' = 1:2,z=3:4) 

.list <- list(x,y) 
library(plyr) 
lapply(.list, rename, replace = c('recnum' = 'ID')) 

[[1]] 
    ID z 
1 1 1 
2 2 2 

[[2]] 
    ID z 
1 1 3 
2 2 4 

你原來的代碼工作正常:

foo <- function(x){ 
    colnr <- which(names(x) == "recnum") 

    if (length(colnr > 0)) {names(x)[colnr] <- "ID"} 
    x 
} 
.list <- list(x,y) 
lapply(.list, foo) 

不知道你的問題是什麼。