如何合并其中一个数据集(1D)用作变量的两个数据集?

时间:2019-04-18 01:34:57

标签: r join jointable

我想加入两个数据集,其中一个数据集(包含1维)被转置并用作变量来加入另一个数据集。

例如:

df = data.frame(A=1:3, B=3:5)
df2 = data.frame(lab = letters[1:5], C = seq(letters[1:5]))

df2_transposed <- data.frame(t(df2))
colnames(df2_transposed ) <- t(df2)[1,]
df2_new <- df2_transposed[2,]

# there are certainly alternatives without transposing data

我想看到一个像这样的数据集:

  A B a b c d e
1 1 3 1 2 3 4 5
2 2 4 1 2 3 4 5
3 3 5 1 2 3 4 5

我尝试了两种方法:

方法1

library(plyr)
new <- join(df, df2_new, by = NULL, type = "left", match = "all")

产生

  A B    a    b    c    d    e
1 1 3 <NA> <NA> <NA> <NA> <NA>
2 2 4 <NA> <NA> <NA> <NA> <NA>
3 3 5 <NA> <NA> <NA> <NA> <NA>

方法2

new1 =  vector('list',3)
for (i in 1:nrow(df)){
   new1[[i]] = cbind(df[i,], df2_new[1,])
}

new2 = data.frame(matrix(unlist(new1), nrow= nrow(df), byrow=T), stringsAsFactors = F)
colnames(new2) <- c(colnames(df), colnames(df2_new))

哪个生产

  A B a b c d e
1 1 3 1 1 1 1 1
2 2 4 1 1 1 1 1
3 3 5 1 1 1 1 1

解决这个问题仍然没有运气。

2 个答案:

答案 0 :(得分:2)

我们可以使用cbind.fill

library(rowr)
cbind.fill(df, df2_new)
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5

如果我们想使用'df / df2'

library(tidyverse)
deframe(df2) %>%
       as.list %>%
       as_tibble %>%  
       cbind.fill(df, .)

或类似于@thelatemails的方法

data.frame(df, as.list(deframe(df2)))

或者使用cbind中的base R并发出友好警告

cbind(df, df2_new)

或复制'df2_new'和cbind

的行
cbind(df, df2_new[rep(1, nrow(df)),])

答案 1 :(得分:2)

仅使用基数R 'characters' is unavailable: Please use String directly命名为cbind

list

或替换表格:

cbind(df, setNames(as.list(df2$C),df2$lab))
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5

或替换的非替换形式:

df[as.character(df2$lab)] <- as.list(df2$C)
df
#  A B a b c d e
#1 1 3 1 2 3 4 5
#2 2 4 1 2 3 4 5
#3 3 5 1 2 3 4 5