R 还可以在数据框结构中添加空行
我想基于两个数据帧构造一个数据帧 这里是一个例子R 还可以在数据框结构中添加空行,r,for-loop,rbind,dplyr,R,For Loop,Rbind,Dplyr,我想基于两个数据帧构造一个数据帧 这里是一个例子 #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
#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))
}
但我想要的是
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,我希望在我的数据帧中有这个空的空间。你知道我怎么能得到这个吗
最后,我想将“cols”的第二列和第三列添加到“d1”中,以获得:
另外,我不希望第二个数据帧产生这样的空白:
some.name some.fav_col some.fav_food
Pedro red pizza
Dave blue hamburguers
name age fav_col fav_food
Li 20 NA NA
Pedro 30 red pizza
Dave 40 blue hamburguers
Grace NA yellow salad
我只想合并表,只保留第一个数据帧的名称,并添加两个额外的列。如果您能从中获得任何帮助,我将不胜感激
我使用了这个,我添加了粘贴和折叠,以防有人需要在一个单元格中添加来自不同单元格的结果
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))
f_add_col谢谢。你知道我怎样才能维持第一栏的秩序吗?我将编辑我的问题,添加一些规范。@EricGonzález,您可以在该列上添加索引和排序,以保持行顺序。
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
df %>% select(name, fav_col) %>% drop_na
# # A tibble: 2 x 2
# name fav_col
# <chr> <chr>
# 1 Dave blue
# 2 Pedro red
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))