我有这个df1:
A B C
1 2 3
5 7 9
其中A B C
是列名。
我有另一个df2有一列:
A
1
2
3
4
我想为df1的每一列添加df2,创建最终的数据帧:
A B C
1 2 3
5 7 9
1 1 1
2 2 2
3 3 3
4 4 4
是否可以这样做?
答案 0 :(得分:10)
data.frame(sapply(df1, c, unlist(df2)), row.names = NULL)
# A B C
#1 1 2 3
#2 5 7 9
#3 1 1 1
#4 2 2 2
#5 3 3 3
#6 4 4 4
数据强>
df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 = structure(list(A = 1:4), .Names = "A", class = "data.frame", row.names = c(NA,
-4L))
答案 1 :(得分:10)
我们可以复制df2
列df1
列,取消名称,然后rbind
。
rbind(df1, unname(rep(df2, ncol(df1))))
# A B C
# 1 1 2 3
# 2 5 7 9
# 3 1 1 1
# 4 2 2 2
# 5 3 3 3
# 6 4 4 4
数据:
df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 <- structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")
答案 2 :(得分:7)
我们可以使用base R
方法
rbind(df1, setNames(as.data.frame(do.call(cbind, rep(list(df2$A), 3))), names(df1)))
# A B C
#1 1 2 3
#2 5 7 9
#3 1 1 1
#4 2 2 2
#5 3 3 3
#6 4 4 4
df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
row.names = c(NA, -4L))
答案 3 :(得分:7)
以下是包含select login_id, ImageURL from TableName where timestamp = (select max(timestamp) from TableName);
,rbind
和rep
的基本R方法:
setNames
编辑:结果rbind(dat, setNames(data.frame(rep(dat1, ncol(dat))), names(dat)))
A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4
不是必需的:
data.frame
会奏效。
数据强>
rbind(dat, setNames(rep(dat1, ncol(dat)), names(dat)))
答案 4 :(得分:7)
我只是喜欢R,这是另一个Base R
解决方案,但是mapply
:
data.frame(mapply(c, df1, df2))
<强>结果:强>
A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4
注意:强>
不需要像几乎所有其他解决方案一样处理类名...这就是为什么这个有效的关键是“mapply
为...的值[...每个元素]调用FUN
(重新循环到最长... [元素]的长度“(请参阅?mapply
)。换句话说,df2$A
会被回收到许多列df1
。
数据:强>
df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 = structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")
答案 5 :(得分:6)
数据:
df1 <- data.frame(A=c(1,5),
B=c(2,7),
C=c(3,9))
df2 <- data.frame(A=c(1,2,3,4))
解决方案:
df2 <- matrix(rep(df2$A, ncol(df1)), ncol=ncol(df1))
colnames(df2) <- colnames(df1)
rbind(df1,df2)
结果:
A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4
答案 6 :(得分:5)
与@ useR的优秀Base R答案类比,这是一个tidyverse
解决方案:
library(purrr)
map2_df(df1, df2, c)
A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4
以下是我第一次回答这个问题时的一些其他(不太理想的)选项。
library(dplyr)
bind_rows(df1, df2 %>% mutate(B=A, C=A))
或者,如果我们想从df1:
动态获取列数及其名称bind_rows(df1,
df2[,rep(1,ncol(df1))] %>% setNames(names(df1)))
还有一个Base R方法:
rbind(df1, setNames(df2[,rep(1,ncol(df1))], names(df1)))
答案 7 :(得分:5)
来自purrr
的解决方案,该解决方案使用map_dfc
遍历df1
中的所有列,将所有元素与df2$A
合并。
library(purrr)
map_dfc(df1, ~c(., df2$A))
# A tibble: 6 x 3
A B C
<int> <int> <int>
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4
df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
row.names = c(NA, -4L))
答案 8 :(得分:1)
为了完整起见,这里有data.table
方法,它不需要处理列名:
library(data.table)
setDT(df1)[, lapply(.SD, c, df2$A)]
A B C 1: 1 2 3 2: 5 7 9 3: 1 1 1 4: 2 2 2 5: 3 3 3 6: 4 4 4
请注意,OP已将df2
描述为仅包含一列。
这种方法还有一个基础R版本:
data.frame(lapply(df1, c, df2$A))
A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4
这类似于d.b's方法,但不需要处理列名。