2012-02-01 21 views
0

考慮下面的例子as.formula不喜歡等價 '='(沒有找到對象)

df1 <- data.frame(a=c(1,2,3),b=c(2,4,6)); 
transform(df1,c=a+b) 
    a b c 
    1 1 2 3 
    2 2 4 6 
    3 3 6 9 

到目前爲止,一切都很好。現在我想動態代碼這一點,使用as.formula:

transform(df1,as.formula("c=a+b")) 

然而,R表示

Error in eval(expr, envir, enclos) : object 'b' not found 

不使用不會出現此錯誤「〜」作爲左手和右手邊的隔板。我能否以某種方式推遲公式的評估?在作業中是否可以使用as.formula?我嘗試過與'與'擺弄,但無濟於事。

+0

我想你想讓他們成爲'表達'而不是公式。然而,看起來你最終會在'eval(parse(text =「whatever」))'上做一些變化,這會導致可怕的,可怕的代碼,很難找到錯誤。如果可能的話,嘗試做一些不太聰明的事情。 – 2012-02-01 11:30:09

+2

將字符串分成等號會更好。在左邊,你可以像'df1 [[「c」]] < - something'。從''a + b「'到在'df1'中評估的意思是''eval(parse(text =」a + b「),df1)'或者同樣醜陋的東西。我建議你告訴我們更多關於你想要達到的目標,所以我們可以幫助你考慮一個替代方案。 – 2012-02-01 11:40:00

+0

在我真正的問題中,它也不是自動執行它的關鍵。我只有大約50列,名稱分爲「X [XOY] [ABC] _ [0-9] [0-9]」,例如「XXA_05」。現在,我想對相同的「X [XOY]」類型和相同數字的所有列進行平均,例如「XXA_00」和「XXB_00」,並將其保存到這些列的第一列。 這當然也可以通過刷新右列來在列級上完成。我只是偶然發現了配方問題,並想知道它是否有可能將其作爲配方實施。 – Johannes 2012-02-01 12:55:26

回答

2

我已經解決了您在評論中提到的問題,因爲這似乎是您的真正目標。這樣可以避免與原始問題中的公式相混淆。

數據集的可重複版本。

group_names <- apply(
    expand.grid("X", c("X", "O", "Y"), c("A", "B", "C"), "_", 0:9, 0:9), 
    1, 
    paste, 
    collapse = "" 
) 
n_groups <- 50 
n_points_per_group <- 10 
df1 <- as.data.frame(matrix(
    runif(n_points_per_group * n_groups), 
    ncol = n_groups 
)) 
colnames(df1) <- sample(group_names, n_groups) 

現在將數據幀轉換爲長格式。 (這裏使用reshape包。你也可以使用stats::reshape。)

melted_df1 <- melt(df1) 

定義基於您條件的第二個字符和數字匹配的分組。

melted_df1$group <- with(melted_df1, paste(
    substring(variable, 2, 2),  
    substring(variable, 5, 6), 
    sep = "" 
)) 

現在叫tapply(或plyr::ddply如果你喜歡),以獲得彙總統計。

with(melted_df1, tapply(value, group, mean))