使用dplyr向数据框添加行

Seb*_*ian 25 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)
Run Code Online (Sandbox Code Playgroud)

我只是想在data.frame中添加一个新行,其中包含nvar1和nvar2的总和以及一个字符,所以使用base RI就可以了

data[nrow(data)+1,] <- c("add",sum(data[,2]),sum(data[,3]))
Run Code Online (Sandbox Code Playgroud)

还是更加聪明的事情,但只是为了告诉你我在寻找什么.

我想在管道环境中使用这个简单的命令,所以数据%>%...给了我上面的结果.

感谢任何帮助,谢谢.

Ric*_*ard 34

使用tibble1.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))
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,因为向量是在全局环境中定义的.很高兴有一个懒惰的列名称.打开[问题](https://github.com/tidyverse/tibble/issues/200) (7认同)

Lyz*_*deR 16

这样的事情可能会:

data %>% 
     rbind(c("add",sum(nvar1),sum(nvar2)))
#        cvar nvar1 nvar2
#1 2015-11-01    12     7
#2 2015-11-02    10     5
#3        All     5     6
#4        add    27    18
Run Code Online (Sandbox Code Playgroud)

编辑:

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

data %>% 
  mutate(nvar3 = nvar1) %>% 
  rbind(c("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 
Run Code Online (Sandbox Code Playgroud)

使用.将允许rbind查找nvar3

EDIT2:

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

> 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
Run Code Online (Sandbox Code Playgroud)


Sal*_*m B 12

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

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data)
Run Code Online (Sandbox Code Playgroud)

结果

        cvar nvar1 nvar2
1        add    27    18
2 2015-11-01    12     7
3 2015-11-02    10     5
4        All     5     6
Run Code Online (Sandbox Code Playgroud)

请注意,这样,新行将添加到原始数据帧的开头而不是末尾.

如果要添加新行的结束,而不是使用下面的代码(感谢krlmlr指出这一点)

data %<>%
  summarise(cvar = "add",
            nvar1 = sum(nvar1),
            nvar2 = sum(nvar2)) %>%
  bind_rows(data, .)
Run Code Online (Sandbox Code Playgroud)

结果

        cvar nvar1 nvar2
1 2015-11-01    12     7
2 2015-11-02    10     5
3        All     5     6
4        add    27    18
Run Code Online (Sandbox Code Playgroud)

  • 使用`bind_rows(data,.)`添加到最后. (2认同)
  • 是的,我注意到它取决于顺序...但对我来说这种行为似乎不一致所以我[在GitHub上打开了相应的问题](https://github.com/hadley/dplyr/issues/2317 ):) (2认同)

tmf*_*mnk 6

summarise_all()利用and的一种选择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
Run Code Online (Sandbox Code Playgroud)

或者添加行,然后使用以下方法仅计算最后一行的总和if_else()

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

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

data %>% 
 add_row(cvar = "add", nvar1 = sum(data$nvar1), nvar2 = sum(data$nvar2))
Run Code Online (Sandbox Code Playgroud)