2016-06-16 43 views
3

在RI合并两个矢量a和b:在R,合并,并使用矢量名称作为列名

a <- c(100,250) 
b <- c(0,100,200) 
foo <- merge(a,b,all=TRUE) 

当我检查FOO,我看到的合并功能已命名为两列x和y:

> foo 
    x y 
1 100 0 
2 250 0 
3 100 100 
4 250 100 
5 100 200 
6 250 200 

有没有一种优雅的方式来保留原始变量名作为列名在结果数据框中? “优雅”我的意思是比explicitly renaming the columns更简单。

+0

我可以问一下,如果你想在现实生活中“合并”两个变量的愿望是否符合这种情况?因为我会为这个用例建议一些'expand.grid'。 – TARehman

回答

8

我们可以转换为data.frame和merge

merge(as.data.frame(a), as.data.frame(b), all = TRUE) 
# a b 
#1 100 0 
#2 250 0 
#3 100 100 
#4 250 100 
#5 100 200 
#6 250 200 
8

您还可以使用expand.grid()为您的特定使用情况。

expand.grid(a = a,b = b) 
    a b 
1 100 0 
2 250 0 
3 100 100 
4 250 100 
5 100 200 
6 250 200 
+0

'expand.grid(mget(c(“a”,“b”)))'如果你想避免双重引用这个名字。 – thelatemail

1

如果你喜欢复杂的生活,这里是另一种选择:

cross.join <- function(a, b) { 
    idx <- expand.grid(seq(length=length(a)), seq(length=length(b))) 
    df <- data.frame(a[idx[,1]], b[idx[,2]]) 
    colnames(df) <- c(deparse(substitute(a)), deparse(substitute(b))) 
    return(df) 
} 

a <- c(100,250) 
b <- c(0,100,200) 
cross.join(a,b) 
    a b 
1 100 0 
2 250 0 
3 100 100 
4 250 100 
5 100 200 
6 250 200 
3

您还可以使用CJdata.table

library(data.table) 
CJ(a=a,b=b) 
    a b 
1: 100 0 
2: 100 100 
3: 100 200 
4: 250 0 
5: 250 100 
6: 250 200 

注意,这个返回data.table ,它与数据框架类似,但有一些不同的行为。如果你想要一个data.frame,你可以使用:

data.frame(CJ(a=a,b=b))