我想加入两个数据集,其中一个数据集(包含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
解决这个问题仍然没有运气。
答案 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