我正在尝试使用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上搜索过,但没有人确切地说这个问题。他们有类似的,但这些方法对此无效。
答案 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
在此示例中,B
,F
和E
是库存名称。据推测,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
但现在你的数字真的是字符,对你来说可能有用也可能没用。