Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr将行添加到数据帧_R_Dplyr - Fatal编程技术网

使用dplyr将行添加到数据帧

使用dplyr将行添加到数据帧,r,dplyr,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) cvar类似这样的话可能: data %>% rbind(c("add",sum(nvar1),sum(nvar2))) # cvar nvar1 nvar2 #1 2015

我有以下样本数据:

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)

cvar类似这样的话可能:

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
编辑:

根据您的评论,这将起作用:

data %>% 
  mutate(nvar3 = nvar1) %>% 
  rbind(c("add",sum(nvar1),sum(nvar2),sum(.$nvar3))) 
使用
将允许
rbind
查找
nvar3

编辑2:

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

> 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

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


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

请注意,通过这种方式,新行将添加到原始数据帧的开头,而不是结尾

如果要在末尾添加新行,请使用以下代码(感谢)


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

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

cvar利用
summary_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\u else()
仅计算最后一行的总和:

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

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

这里有任何
数据.表格
。只要你把它放入管道,它就会变成一个data.table,不是吗?
数据。table
是一个不同的包。要转换为
data.table
,它应该是
data.table(cvar,…)
如果您使用的是
dplyr
,那么请尝试使用
bindrows
您可能指的是
tbl_df
啊,很抱歉,我会编辑它。如果您将第一列转换为“character”,我唯一能证明“dplyr”正确的方法就是<代码>数据%>%变异(cvar=as.character(cvar))%>%rbind(c(“添加”,总和(nvar1),总和(nvar2)))
。否则,
rbind(data,c(“add”),sum(nvar1),sum(nvar2))
也会这样做……谢谢LyzandeR,这确实解决了上述问题,+1。但在管道中,它对我不起作用,比如说:数据%>%mutate(nvar3=nvar1)%%>%rbind(c(“add”,sum(nvar1),sum(nvar2),sum(nvar3))),我需要在一系列转换之后使用rbind,在问题中没有提到这一点,对此表示抱歉。@Sebastian Yeah在您上面描述的情况下,
nvar3
无法在
data
中找到,因此出现错误。你应该这样做:
data%>%mutate(nvar3=nvar1)%>%rbind(c(“add”,sum(nvar1),sum(nvar2),sum(.$nvar3))
它会工作的。@AnandaMahto我完全同意。OP似乎需要在更复杂的情况下将其作为一个步骤。通过rbinding字符向量,您已将结果中的NVAR转换为字符。这是有效的,因为这些向量是在全局环境中定义的。对列名进行懒散的评估会很好。打开了一个现在可以很好地使用懒散的列名评估,这显然是imo中最
tidyverse
的选项!使用
bind_行(数据,)
添加到末尾。@krlmlr谢谢!我没有意识到在末尾添加新行有那么容易。有趣的是,执行此操作时会出现“绑定行”(x,.id)中的警告消息
:绑定因子和字符向量,强制转换为字符向量
,但不会反过来出现(
绑定行(,数据)
)。你知道这是为什么吗?更简单的例子:
bind_行(data_-frame(a=“a”)、data_-frame(a=factor(“a”))
vs.
bind_行(data_-frame(a=factor(“a”)、data_-frame(a=“a”))
。似乎取决于顺序,也许我的第一个例子中没有警告只是一个简单的遗漏。仔细检查一下,确定一下。是的,我注意到这取决于订单。。。但对我来说,这种行为似乎前后不一致,所以我有:)顶!Thank将添加到use sum(,na.rm=T)中,还将添加到use方括号中,以防止RStudio:data%>%bind_行中出现警告(汇总_all(,~if(is.numeric(.)){sum(,na.rm=T)}else{“Total”}))
        cvar nvar1 nvar2
1        add    27    18
2 2015-11-01    12     7
3 2015-11-02    10     5
4        All     5     6
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
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)))
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
data %>%
 add_row(cvar = "add") %>%
 mutate_at(-1, ~ if_else(row_number() == max(row_number()), sum(., na.rm = TRUE), .))
data %>% 
 add_row(cvar = "add", nvar1 = sum(data$nvar1), nvar2 = sum(data$nvar2))