2011-06-18 50 views
4

定義列表反黑有兩個dataframes,DF1DF2在列表中與dataframes工作:刪除變量,添加新的

dats <- list(df1 = data.frame(a=sample(1:3), b = sample(11:13)), 
    df2 = data.frame(a=sample(1:3), b = sample(11:13))) 

> dats 
$df1 
    a b 
1 2 12 
2 3 11 
3 1 13 

$df2 
    a b 
1 3 13 
2 2 11 
3 1 12 

我想順路可變一個每個數據幀。接下來,我想每個數據幀的ID從外部數據框中添加一個變量,如:

ids <- data.frame(id=c("id1","id2"),df=c("df1","df2")) 
> ids 
    id df 
1 id1 df1 
2 id2 df2 

要刪除我想這是不必要的增值經銷商沒有運氣:

> dats <- lapply(dats, function(x) assign(x, x[,c("b")])) 
> Error in assign(x, x[, c("b")]) : invalid first argument 

不知道怎麼加id也是。

我也試過,也許更恰當:

> temp <- lapply(dats, function(x) subset(x[1], select=x[[1]]$b)) 
Error in x[[1]]$b : $ operator is invalid for atomic vectors 

我感到困惑的是,str(out[1])返回一個列表,str(out[[1]])返回一個數據幀。我認爲這可能與它有關。

+0

如果您不同意我的編輯,請隨時回滾。我喜歡這個問題。 – bernie

回答

5

或者試試這個:提取您的ids成數據幀名映射到ID名爲向量:

df2id <- ids$id 
names(df2id) <- ids$df 

> df2id 
df1 df2 
id1 id2 
Levels: id1 id2 

然後使用mapply到兩個(一)從每滴a列數據幀,和(b)添加id柱:

> mapply(function(d,x) cbind(subset(d, select = -a), 
+        id = x), 
+   dats, df2id[ names(dats) ] , 
+   SIMPLIFY=FALSE) 
$df1 
    b id 
1 12 id1 
2 11 id1 
3 13 id1 

$df2 
    b id 
1 12 id2 
2 11 id2 
3 13 id2 

注意,我們傳遞df2id[ names(dats) ]mapply - 這確保df2id中的數據幀與dats中的數據幀「對齊」。

2

可以嗎?

dats <- list(df1 = data.frame(a=sample(1:3), b = sample(11:13)), 
    df2 = data.frame(a=sample(1:3), b = sample(11:13))) 

ids <- data.frame(id=c("id1","id2"),df=c("df1","df2")) 

# remove variable a 
dats2 <- lapply(dats, function(x) x[,!names(x) == "a"]) 

# add id 
for(i in 1:length(dats2)) { 
    dats2[[i]] <- merge(dats2[[i]], ids$id[ids$df == names(dats2)[i]]) 
} 

dats2 

    $df1 
    x y 
    1 11 id1 
    2 12 id1 
    3 13 id1 

    $df2 
    x y 
    1 11 id2 
    2 12 id2 
    3 13 id2 
+0

+1非常簡潔。在真正的應用程序中,我嘗試對id數據幀進行排序,以便它與dats2具有相同的順序,然後循環訪問其中一個數據幀。 '名字(dats2)[i]'在這裏讓人大開眼界。它允許使用合併,讓他在飛行中排序。 – Fred

+0

有沒有一種方法可以爲在同一行內添加的列指定一個名稱。我看到may應用程序中的默認值是調用它* y *。它可以被指定爲* id *嗎? – Fred

相關問題