2011-04-26 76 views
3

有条件帧欲乘两个data.frames是不相等的长度 的如果我有观测的数据帧(在现实中,这是围绕30000条目长)乘以数据中的R

Species number 
1   3 
1   3 
3   5 
4   40 
5   22 

和另一与存在于第一数据帧中的每个物种转化率数据帧(这仅是约120长度的条目)

species conversion ratio 
1   3 
2   5 
3   4 
4   2 
5   2 

,我想乘与该物质相关的转换比率条目中的每个数列条目,我该怎么走关于在R中这样做?

我试图使用匹配函数无济于事,我尝试使用数组也只会导致错误。

回答

4

请参阅?merge。假设您有species一致性(首都):

df3 <- merge(df1,df2) 
df3$number*df3$conversion.ratio 
+0

合并步骤不会产生所需的数据帧。它产生一个更长的数据帧 – Jota 2011-04-26 17:47:52

+0

@Frank您期望的数据框的尺寸是多少?如果你只是想删除重复的行,请尝试'df4 < - subset(df3,!duplicated(df3))' – jthetzel 2011-04-26 20:39:41

+0

对不起,不清楚。我最终的数据帧长达数百万条,当我想要的数据帧应该是每列大约30,000个条目时。我认为这是因为,正如@詹姆斯所说,这两列没有相同的名称(即物种与物种)。我将它们重命名为相同的,在这种情况下,使用',by =“species”'除了merge()函数是不必要的,一旦列被重命名,您提出的解决方案就可以很好地工作。对不起,我起初并不明白@詹姆斯说:“假设你有一个名字一致的名字”(首都)。“ – Jota 2011-04-27 04:00:20

3

您可以合并两个数据帧。

## Your example data 
df.number <- matrix(c(1, 1, 3, 4, 5, 3, 3, 5, 40, 22), ncol = 2) 
colnames(df.number) <- c("species", "number") 
df.ratio <- matrix(c(1, 2, 3, 4, 5, 3, 5, 4, 2, 2), ncol = 2) 
colnames(df.ratio) <- c("species", "ratio") 

## Merge the two matrices 
dat <- merge(df.number, df.ratio, by = "species") 

## Multiply for your result 
result <- with(dat, number * ratio) 

编辑

@Frank:在詹姆斯的评论,你说,合并后所得到的数据帧过长。你的意思是你想删除重复的行吗?如果是这样的话:

dat2 <- subset(dat, subset = !duplicated(dat)) 
result2 <- with(dat2, number * ratio) 
+1

使用'with()'而不是'$'憎恶:-) – 2011-04-26 17:48:34