在数据框架构造中添加空行

时间:2018-03-14 06:46:04

标签: r for-loop rbind

我想基于两个数据帧构建数据帧

这是一个例子

#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

我只想合并表格,只保留第一个数据框的名称,并添加两个额外的列。我将不胜感激任何帮助

2 个答案:

答案 0 :(得分:0)

您可以使用中的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做了同样的事情。