我有这个样本数据:
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
使用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))
Run Code Online (Sandbox Code Playgroud)
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)
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)