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))