使用dplyr向数据框添加行

时间:2015-11-06 11:37:39

标签: r dplyr

我有这个样本数据:

cvar <- c("2015-11-01","2015-11-02","All")
nvar1 <- c(12,10,5)
nvar2 <- c(7,5,6)
data <- cbind.data.frame(cvar,nvar1,nvar2)

我只是想在data.frame中添加一个新行,其中包含nvar1和amp;的总和。 nvar2和一个字符,所以使用基数R我会使用

data[nrow(data)+1,] <- c("add",sum(data[,2]),sum(data[,3]))

或者用lapply更聪明的东西,但只是为了告诉你我在寻找什么。

我想在管道环境中使用这个简单的命令,因此数据%&gt;%...给出了上述结果。

感谢您的帮助,谢谢。

5 个答案:

答案 0 :(得分:34)

使用tibble版本1.2,您可以使用add_row()

https://blog.rstudio.org/2016/08/29/tibble-1-2-0/

data %>% 
 add_row(cvar = "add", nvar1 = sum(nvar1), nvar2 = sum(nvar2))

答案 1 :(得分:15)

然后可能会这样:

data %>% 
  mutate(nvar3 = nvar1) %>% 
  rbind(c("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 

编辑:

根据你的评论,这将有效:

.

使用rbind将允许nvar3找到> str( + data %>% + mutate(nvar3 = nvar1) %>% + rbind(list("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) + ) 'data.frame': 4 obs. of 4 variables: $ cvar : chr "2015-11-01" "2015-11-02" "All" "add" $ nvar1: num 12 10 5 27 $ nvar2: num 7 5 6 18 $ nvar3: num 12 10 5 27

EDIT2:

将新行作为列表提供,它将维护列类:

tsrange

答案 2 :(得分:12)

仅使用dplyr,您可以执行以下操作

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data)

导致

        cvar nvar1 nvar2
1        add    27    18
2 2015-11-01    12     7
3 2015-11-02    10     5
4        All     5     6

请注意,通过这种方式,新行将添加到而不是原始数据框的末尾。

如果您想在最后添加新行 ,请使用以下代码(感谢krlmlr for pointing this out

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data, .)

导致

        cvar nvar1 nvar2
1 2015-11-01    12     7
2 2015-11-02    10     5
3        All     5     6
4        add    27    18

答案 3 :(得分:2)

使用silly(n - 2, m)summarise_all()的一个选项可能是:

bind_rows()

或添加该行,然后使用data %>% bind_rows(summarise_all(., ~ if (is.numeric(.)) sum(.) else "add")) cvar nvar1 nvar2 1 2015-11-01 12 7 2 2015-11-02 10 5 3 All 5 6 4 add 27 18 仅计算最后一行的总和:

if_else()

或者当变量不在全局环境中时,@ Rickard的答案的替代方法:

data %>%
 add_row(cvar = "add") %>%
 mutate_at(-1, ~ if_else(row_number() == max(row_number()), sum(., na.rm = TRUE), .))

答案 4 :(得分:0)

如果有人仍在寻找通用解决方案,我会使用:

cvar <- c("2015-11-01","2015-11-02","All")
nvar1 <- c(12,10,5)
nvar2 <- c(7,5,6)
data <- tibble::tibble(cvar,nvar1,nvar2)

purrr::map_df(data, ~c(.x, ifelse(is.numeric(.x), sum(.x, na.rm=TRUE), NA)))

P.S。我用tibble保留字符,因为数据框将它们转换为factor和base :: c“销毁”了它们