我需要根据另一个数据帧中的多个标准在数据帧中查找一个值。示例
A=
Country Year Number
USA 1994 455
Canada 1997 342
Canada 1998 987必须添加了一个名为"rate“的列。
B=
Year USA Canada
1993 21 654
1994 41 321
1995 56 789
1996 85 123
1997 65 456
1998 1 999所以最终的数据框架是
C=
Country Year Number Rate
USA 1994 455 41
Canada 1997 342 456
Canada 1998 987 999换句话说:从A到B查找年份和国家,结果是C。我想这样做没有循环。我希望有一个一般的方法,这样我就可以根据两个以上的标准进行查询。
发布于 2015-10-07 12:18:54
下面是另一种使用data.table的方法,它不需要将第二个数据表转换为长表单:
require(data.table) # 1.9.6+
A[B, Rate := get(Country), by=.EACHI, on="Year"]
# Country Year Number Rate
# 1: USA 1994 455 41
# 2: Canada 1997 342 456
# 3: Canada 1998 987 999其中A和B是data.tables,而Country是字符类型的。
发布于 2015-10-07 11:51:41
我们可以melt第二个数据集从‘宽’到‘长’格式,merge与第一个数据集,以获得预期的输出。
library(reshape2)
res <- merge(A, melt(B, id.var='Year'),
by.x=c('Country', 'Year'), by.y=c('variable', 'Year'))
names(res)[4] <- 'Rate'
res
# Country Year Number Rate
#1 Canada 1997 342 456
#2 Canada 1998 987 999
#3 USA 1994 455 41或者我们可以使用来自tidyr和right_join的tidyr和right_join来完成这个任务。
library(dplyr)
library(tidyr)
gather(B, Country,Rate, -Year) %>%
right_join(., A)
# Year Country Rate Number
#1 1994 USA 41 455
#2 1997 Canada 456 342
#3 1998 Canada 999 987或者,正如@DavidArenburg在评论中提到的那样,这也可以用data.table来完成。我们将“data.frame”转换为“data.table”(setDT(A)),将第二个数据集转换为melt,并加入on 'Year‘和'Country’。
library(data.table)#v1.9.6+
setDT(A)[melt(setDT(B), 1L, variable = "Country", value = "Rate"),
on = c("Country", "Year"),
nomatch = 0L]
# Country Year Number Rate
# 1: USA 1994 455 41
# 2: Canada 1997 342 456
# 3: Canada 1998 987 999或者更短的版本(如果我们不太挑剔,没有变量名称)
setDT(A)[melt(B, 1L), on = c(Country = "variable", Year = "Year"), nomatch = 0L]https://stackoverflow.com/questions/32991376
复制相似问题