Chaturvedi Dewashish
Chaturvedi Dewashish

Reputation: 1469

Merge column of a dataframe from row of another data frame

I am trying to merge two different data frames.

Id  data
T1  100
T2  250
T3  300


T1  T2  T3 
1   2   3

Output I am trying to get

Id  data component
T1  100     1
T2  250     2
T3  300     3

Upvotes: 0

Views: 51

Answers (3)

Cath
Cath

Reputation: 24074

What about :

if df is your first data.frame and vec is your vector (with names "T1","T2","T3")

note that using match ensures that everything goes well even if the names are not in the same order in both data.frames.

df$component<-vec[match(df$Id,names(vec))] # if vec is a vector

df$component<-unlist(vec[1,match(df$Id,colnames(vec))]) # if vec is a one row data.frame

data :

df<-structure(list(Id = structure(1:3, .Label = c("T1", "T2", "T3"), 
              class = "factor"), data = c(100L, 250L, 300L)), 
              .Names = c("Id","data"), class = "data.frame", row.names = c(NA, -3L))

vec<-structure(1:3, .Names = c("T1", "T2", "T3"))

output :

> df
  Id data component
1 T1  100         1
2 T2  250         2
3 T3  300         3

Upvotes: 1

jazzurro
jazzurro

Reputation: 23574

One way would be the following. But, if your data are just like the example, @user2438475 idea is probably the way to go.

library(dplyr)
library(tidyr)

gather(mydf2, variable, component) %>%
left_join(mydf, ., by = c("Id" = "variable"))

#  Id data component
#1 T1  100         1
#2 T2  250         2
#3 T3  300         3

DATA

mydf <- structure(list(Id = structure(1:3, .Label = c("T1", "T2", "T3"
        ), class = "factor"), data = c(100L, 250L, 300L)), .Names = c("Id", 
        "data"), class = "data.frame", row.names = c(NA, -3L))

mydf2 <- structure(list(T1 = 1L, T2 = 2L, T3 = 3L), .Names = c("T1", "T2", 
         "T3"), class = "data.frame", row.names = c(NA, -1L))

Upvotes: 1

Andrew Taylor
Andrew Taylor

Reputation: 3488

dat1<-data.frame(Id=c("T1","T2","T3"),data=c(100,250,300))
dat2<-data.frame(T1=1,T2=2,T3=3)

Just transpose dat2 using t(dat2)

data3<-data.frame(dat1,component=t(dat2))


> data3<-data.frame(dat1,component=t(dat2))
> data3
   Id data component
T1 T1  100         1
T2 T2  250         2
T3 T3  300         3

Upvotes: 2

Related Questions