R在一个数据框中按列名称合并(),在另一个数据框中合并一列

时间:2016-08-09 11:38:03

标签: r merge

我正在尝试使用R中的合并功能。我在一些数据框D中有一个列名称(股票名称)列表。然后我有另一个数据框'信息',其中这些股票名称存储在一列中,在下一列中使用相应的扇区名称。我需要将这些扇区名称合并到D中的一行。

如果我在2列上合并,我可以直接使用merge()并改变by.x和by.y,并且emrged值将显示为额外的列。但是,D的名称我正在合并作为其列名,所以我基本上希望它添加额外的行?以下代码不起作用:

M<-merge(D,Info[,c("Name","Sector")],by.x=colnames(D), by.y=c("Name"))
P.S我在SO上搜索过,但没有人确切地说这个问题。他们有类似的,但这些方法对此无效。

1 个答案:

答案 0 :(得分:0)

根据您的说明,D看起来像

set.seed(1)
D <- data.frame(matrix(runif(9), nc=3))
names(D) <- sample(LETTERS, 3)

> D
          B         F         E
1 0.2655087 0.9082078 0.9446753
2 0.3721239 0.2016819 0.6607978
3 0.5728534 0.8983897 0.6291140

在此示例中,BFE是库存名称。据推测,info看起来像这样:

info <- data.frame(NAME=LETTERS, sector=letters)
> info
   NAME sector
1     A      a
2     B      b
3     C      c
4     D      d
5     E      e
6     F      f
7     G      g
..snip..

我们的想法是从sector中提取正确的info,然后将rbind该向量提取到D。请注意,rbind匹配第一个和第二个对象的名称。

merged <- rbind(D, sapply(names(D), function(x) info$sector[info$NAME==x]))
> merged
          B         F         E
1 0.2655087 0.9082078 0.9446753
2 0.3721239 0.2016819 0.6607978
3 0.5728534 0.8983897 0.6291140
4 2.0000000 6.0000000 5.0000000

sector(这是一种因子类型)已转换为浮点数。为了使合并表看起来不错,你可以做到

rbind(format(D),
  as.character(
    sapply(names(D), function(x) info$sector[info$NAME==x])
  )
)
          B         F         E
1 0.2655087 0.9082078 0.9446753
2 0.3721239 0.2016819 0.6607978
3 0.5728534 0.8983897 0.6291140
4         b         f         e

但现在你的数字真的是字符,对你来说可能有用也可能没用。