Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数据从一个数据帧匹配到另一个数据帧_R - Fatal编程技术网

R 将数据从一个数据帧匹配到另一个数据帧

R 将数据从一个数据帧匹配到另一个数据帧,r,R,首先,如果这个问题的措辞不尽可能好,我表示歉意。我对这个问题不熟悉,但我试图把问题说清楚。我正在努力实现以下目标 我有两个数据帧,试图从其中一个帧中获取数据,并将其添加到另一个帧中的新列中,我在下面创建了一个示例 IDa <- c(1,2,3) score1a <- c(5,10,1) score2a <- c(NA,8,NA) score3a <- c(NA,NA,13) dfa <- data.frame(IDa,score1a,score2a,score3a

首先,如果这个问题的措辞不尽可能好,我表示歉意。我对这个问题不熟悉,但我试图把问题说清楚。我正在努力实现以下目标

我有两个数据帧,试图从其中一个帧中获取数据,并将其添加到另一个帧中的新列中,我在下面创建了一个示例

IDa <- c(1,2,3)
score1a <- c(5,10,1)
score2a <- c(NA,8,NA)
score3a <- c(NA,NA,13)

dfa <- data.frame(IDa,score1a,score2a,score3a)

IDb <- c(1,1,1,2,2,3)
timeb <- c(1,2,3,2,3,3)

dfb <- data.frame(IDb,timeb)

IDa您可以
dfa
融化为
long
表单,然后在转换
变量
列以匹配
timeb
后,将
dfb
合并

library(reshape2)
merge(dfb,transform(melt(dfa, id.var='IDa', na.rm=TRUE),
             variable=as.numeric(factor(variable))),
               by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'), all.x=TRUE)
#    IDb timeb value
#1   1     1     5
#2   1     2    NA
#3   1     3    NA
#4   2     2     8
#5   2     3    NA
#6   3     3    13
或者将列名更改为,然后执行
merge

colnames(dfa)[-1] <- 1:3
merge(dfb, melt(dfa, id.var='IDa'),
        by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'))

colnames(dfa)[-1]您可以
melt
dfa
long
表单,然后
merge
在转换
变量
列以匹配
timeb
后使用
dfb
进行合并

library(reshape2)
merge(dfb,transform(melt(dfa, id.var='IDa', na.rm=TRUE),
             variable=as.numeric(factor(variable))),
               by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'), all.x=TRUE)
#    IDb timeb value
#1   1     1     5
#2   1     2    NA
#3   1     3    NA
#4   2     2     8
#5   2     3    NA
#6   3     3    13
或者将列名更改为,然后执行
merge

colnames(dfa)[-1] <- 1:3
merge(dfb, melt(dfa, id.var='IDa'),
        by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'))

colnames(dfa)[-1]另一个选项是:

require(dplyr)
require(tidyr)

gather(dfa, Score, Val, -IDa) %>% 
  mutate(Score = as.numeric(gsub("[a-zA-Z]","",  Score))) %>% 
  left_join(dfb, ., by = c("IDb" = "IDa", "timeb" = "Score"))

#  IDb timeb Val
#1   1     1   5
#2   1     2  NA
#3   1     3  NA
#4   2     2   8
#5   2     3  NA
#6   3     3  13

这些步骤与akrun的答案类似,但使用的功能不同。

另一个选项是:

require(dplyr)
require(tidyr)

gather(dfa, Score, Val, -IDa) %>% 
  mutate(Score = as.numeric(gsub("[a-zA-Z]","",  Score))) %>% 
  left_join(dfb, ., by = c("IDb" = "IDa", "timeb" = "Score"))

#  IDb timeb Val
#1   1     1   5
#2   1     2  NA
#3   1     3  NA
#4   2     2   8
#5   2     3  NA
#6   3     3  13

这些步骤与akrun的答案类似,但使用不同的功能。

你真的有
dplyr
像pro一样向下你真的有
dplyr
像pro一样向下