通过匹配ID和列名检索data.frame的值
我有一个名为通过匹配ID和列名检索data.frame的值,r,date,dataframe,R,Date,Dataframe,我有一个名为df1的数据帧,它有四列(即id、s、date和value)。value列为空,我想使用第二个名为df2的数据帧来填充它df2由id列和许多其他使用所属日期命名的列填充。我只需要在df2中找到df1$value的对应值,其中日期和id号都匹配 示例数据: set.seed(123) #df1 df1 <- data.frame(id = 1:100, s = runif(100,100,1000),
df1
的数据帧,它有四列(即id
、s
、date
和value
)。value列为空,我想使用第二个名为df2
的数据帧来填充它df2
由id
列和许多其他使用所属日期命名的列填充。我只需要在df2
中找到df1$value
的对应值,其中日期和id号都匹配
示例数据:
set.seed(123)
#df1
df1 <- data.frame(id = 1:100,
s = runif(100,100,1000),
date = sample(seq(as.Date('1999/01/01'), as.Date('2001/01/01'), by="day"), 100),
value = NA)
#df2
df2 <- data.frame(matrix(runif(80000,1,100), ncol=800, nrow=100))[-1]
names(df2) <- seq(as.Date("1999-01-01"),as.Date("2002-12-31"),1)[c(1:799)]
df2 <- cbind(id = 1:100, df2)
set.seed(123)
#df1
df1一种方法是使用collect
将df2
转换为长格式,然后执行left\u join
library(dplyr)
library(tidyr)
df1 %>%
left_join(df2 %>%
gather(date, value, -id) %>%
mutate(date = as.Date(date)), by = c("id", "date"))
# id s date value
#1 1 359 2000-03-15 48.32
#2 2 809 1999-09-01 62.16
#3 3 468 1999-12-23 16.41
#4 4 895 2000-11-26 32.70
#5 5 946 1999-12-18 5.84
#6 6 141 2000-10-09 74.65
#7 7 575 2000-10-25 9.22
#8 8 903 2000-03-17 6.46
#9 9 596 1999-10-25 73.48
#10 10 511 1999-04-17 62.43
#...
数据
set.seed(123)
df1 <- data.frame(id = 1:100,
s = runif(100,100,1000),
date = sample(seq(as.Date('1999/01/01'), as.Date('2001/01/01'), by="day"), 100))
df2 <- data.frame(matrix(runif(80000,1,100), ncol=800, nrow=100))[-1]
names(df2) <- seq(as.Date("1999-01-01"),as.Date("2002-12-31"),1)[c(1:799)]
df2 <- cbind(id = 1:100, df2)
set.seed(123)
df1您还可以使用melt,然后使用两个键左键连接:
library(dplyr)
library(reshape2)
set.seed(123)
#df1
df1 <- data.frame(id = 1:100,
s = runif(100,100,1000),
date = sample(seq(as.Date('1999/01/01'), as.Date('2001/01/01'), by="day"), 100),
value = NA)
#df2
df2 <- data.frame(matrix(runif(80000,1,100), ncol=800, nrow=100))[-1]
names(df2) <- seq(as.Date("1999-01-01"),as.Date("2002-12-31"),1)[c(1:799)]
df2 <- cbind(id = 1:100, df2)
df2<-melt(df2, id.vars = "id", value.name = "Value", variable.name = "date")
df2$date<-as.Date(df2$date, format = "%Y-%m-%d")
df1<-left_join(df1, df2, by = c("id", "date"))
head(df1)
id s date value Value
1 1 358.8198 2000-03-15 NA 48.31799
2 2 809.4746 1999-09-01 NA 62.15760
3 3 468.0792 1999-12-23 NA 16.41291
4 4 894.7157 2000-11-26 NA 32.70024
5 5 946.4206 1999-12-18 NA 5.83607
6 6 141.0008 2000-10-09 NA 74.64832
库(dplyr)
图书馆(E2)
种子集(123)
#df1
df1我们可以使用data.table连接的有效方法。对于大型数据集,它应该是快速的
library(data.table)
setDT(df1)[melt(setDT(df2), id.var = 'id')[,
date := as.IDate(variable, '%Y-%m-%d')], on = .(id, date)]
tnx,@Ronak Shah。太快了!许多tnx@Harshal。很好的解决方案,希望它适用于我庞大的数据集。欢迎Majid。。随时。重新打开的修订后版本可能与和(常见问题)重复@akrun我不认为这是重复的,因为OP从未要求“转换为长格式并加入”。然而,幸运/不幸的是,到目前为止所有的答案都提供了相同的解决方案。这篇文章可能有答案,不需要转换成长格式。我的意思是,副本应该根据所问的问题而不是所贴的答案进行标记,因此,我重新打开了它。