我想基于两个数据帧构建数据帧
这是一个例子
#toy example
name <- c("Li", "Pedro", "Dave")
age <- c(20, 30, 40)
d1 <- cbind.data.frame(name, age)
name <- c("Pedro", "Dave", "Grace")
fav_col <- c("red", "blue", "yellow")
lastname <- c("Sanchez", "Stone", "Flint")
fav_food <- c("pizza", "hamburguers", "salad")
d2 <- cbind.data.frame(name, fav_col, lastname, fav_food)
d1$name <- as.character(d1$name)
d2$name <- as.character(d2$name)
cols <- c()
for(i in 1:nrow(d1)) {
some <- dplyr::filter(d2, name==d1$name[i])
cols <- rbind.data.frame(cols, data.frame(some$name, some$fav_col, some$fav_food))
}
这样做我正在获得一个名为&#34; cols&#34;的数据框。看起来像这样:
some.name some.fav_col some.fav_food
Pedro red pizza
Dave blue hamburguers
但我想要的是
some.name some.fav_col some.fav_food
NA(or empty) NA(or empty) Na(or empty)
Pedro red pizza
Dave blue hamburguers
当i = 1时的第一次迭代必须产生一个空出口,因为第二个数据帧中没有Li,并且我希望在我的数据帧中有这个空白空间。你知道我怎么能得到这个吗?
最后,我想添加&#34; cols&#34;的第二和第三列。到&#34; d1&#34;得到:
name age fav_col fav_food
Li 20 NA (or empty) NA (or empty)
Pedro 30 red pizza
Dave 40 blue hamburguers
同样我不想想要第二个数据框可能产生的空白空间:
name age fav_col fav_food
Li 20 NA NA
Pedro 30 red pizza
Dave 40 blue hamburguers
Grace NA yellow salad
我只想合并表格,只保留第一个数据框的名称,并添加两个额外的列。我将不胜感激任何帮助
答案 0 :(得分:0)
您可以使用dplyr中的union_all
。
library(tidyr)
library(dplyr)
df <- union_all(d1, d2) %>%
mutate_if(is.factor, as.character) %>% # only required when your text columns are
group_by(name) %>% # identified as factor and not character.
summarise_all(max, na.rm = TRUE) %>% # Because max only works on numeric or char
ungroup
df
# # A tibble: 3 x 4
# name age fav_col lastname
# <chr> <dbl> <chr> <chr>
# 1 Dave 40. blue Stone
# 2 Li 20. NA NA
# 3 Pedro 30. red Sanchez
要获得所需的输出,您可以将drop_na
添加到链中。
df %>% select(name, fav_col) %>% drop_na
# # A tibble: 2 x 2
# name fav_col
# <chr> <chr>
# 1 Dave blue
# 2 Pedro red
答案 1 :(得分:0)
我使用了这个,并且我添加了粘贴和折叠,以防有人需要在一个中添加来自不同单元格的结果。
f_add_col <- function(vec) {
add_col <- dplyr::filter(d2, name==vec[1])
return (paste(add_col$fav_col, collapse = "|"))
}
cbind.data.frame(d1, fav_col=apply(d1, 1, f_add_col))
然后我为列fav_food做了同样的事情。