2011-10-02 48 views
2

我發現合併一個困難的概念(內部,外部,右側,左側 ...)所以原諒簡單的問題。
我想將生成的每一列合併到以前出現的列中。我需要哪種合併?

labelA <- array(letters[1:10], dim=c(10,1)) 

## Function: test_values ## 
test_func = function(df, nameA, nameB) { 
test_values <- array(data=1, dim=c(10,1)) 
for (i in 1:10){ 
    test_values[i] <- paste(nameA, nameB, i, sep="_") 
    } 
merge (x=df, y=test_values, sort=FALSE, all=TRUE) # ?? 
} 

# Comparison #1 
nameA <-"A" 
nameB <-"B" 
gran_total = test_func(labelA, nameA, nameB) 

# Comparison #2 
nameA <-"C" 
nameB <-"D" 
gran_total = test_func(gran_total, nameA, nameB) 

但我的輸出是由1列的30行的矩陣。

我想(無法弄清楚如何返回)的10行3列

V1 V2  V3 
a A_B_1 C_D_1 
b A_B_2 C_D_2 
c A_B_3 C_D_3 
d A_B_4 C_D_4 
e A_B_5 C_D_5 
... 

回答

2

也許你需要的是cbinddata.frame,而不是merge矩陣。

下面是一個例子:

> labelA <- array(letters[1:3], dim=c(3,1)) 

> # simple way 
> data.frame(labelA, paste("A", "B", 1:3, sep = "_"), paste("C", "D", 1:3, sep = "_")) 
    labelA paste..A....B...1.3..sep...._.. paste..C....D...1.3..sep...._.. 
1  a       A_B_1       C_D_1 
2  b       A_B_2       C_D_2 
3  c       A_B_3       C_D_3 

> # generalize as a function 
> f <- function(df, nA, nB) paste(nA, nB, 1:nrow(df), sep = "_") 
> data.frame(labelA, f(labelA, "A", "B"), f(labelA, "C", "D")) 
    labelA f.labelA...A....B.. f.labelA...C....D.. 
1  a    A_B_1    C_D_1 
2  b    A_B_2    C_D_2 
3  c    A_B_3    C_D_3 

> # more generalize for flexible arguments 
> f2 <- function(df, labels) 
+ data.frame(df, do.call("cbind", llply(labels, 
+  function(x) do.call("paste", c(as.list(x), list(1:nrow(df)), sep = "_"))))) 

> f2(labelA, list(c("A", "B"), c("C", "D"))) 
    df X1 X2 
1 a A_B_1 C_D_1 
2 b A_B_2 C_D_2 
3 c A_B_3 C_D_3 

> f2(labelA, list(c("A", "B"), c("C", "D"), c("E", "F", "G"))) 
    df X1 X2  X3 
1 a A_B_1 C_D_1 E_F_G_1 
2 b A_B_2 C_D_2 E_F_G_2 
3 c A_B_3 C_D_3 E_F_G_3 
+0

我發現** ** data.frame效果最好。我應該想通了......我嘗試了* cbind *,但無法使其工作。乾杯,K – oaxacamatt