Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
R 按组添加行_R_Dplyr - Fatal编程技术网

R 按组添加行

R 按组添加行,r,dplyr,R,Dplyr,我观察了不同日期(date2)人群中不同字符(代码)的频率(eff) 这就是我产生输出的方式: datas %>% group_by(date2) %>% summarise(eff = (sum(total) / n()) - sum(eff)) %>% inner_join(datas, by = "date2") %>% select(-c(eff.y, code), eff = eff.x) %>% distinct %>

我观察了不同日期(date2)人群中不同字符(代码)的频率(eff)

这就是我产生输出的方式:

datas %>% 
  group_by(date2) %>% 
  summarise(eff = (sum(total) / n()) - sum(eff)) %>% 
  inner_join(datas, by = "date2") %>% 
  select(-c(eff.y, code), eff = eff.x) %>% 
  distinct %>% 
  mutate(code = "KO") %>% 
  bind_rows(datas)
但我不喜欢这个解决方案,我想知道是否有人有更好的

另外,您将如何处理2个分组变量(下面的示例中的date1和Date2)

datas2 datas2
日期2日期1代码效果总计
1 2015-07-25 2015-07-24 A 50 100
2 2015-07-25 2015-07-24 B 30100
3 2015-07-26 2015-07-24 A 20 100
4 2015-07-26 2015-07-24 B 10100
5 2015-07-27 2015-07-24 A 20 100
6 2015-07-27 2015-07-24 B 20 100
7 2015-07-26 2015-07-25 A 10 100
8 2015-07-26 2015-07-25 B 20 100
9 2015-07-27 2015-07-25 A 30 100
10 2015-07-27 2015-07-25 B 40100
谢谢你的建议

你可以试试

 library(dplyr)
 datas %>% 
   group_by(date2, date1) %>% 
   summarise(eff=total[1L]-sum(eff), code='KO', total=total[1L]) %>%
   bind_rows(., datas) %>%
   arrange(date2,code) 
或类似的
数据。表
方法

 library(data.table)
 rbind(datas,setDT(datas)[, list(eff=total[1L]-sum(eff),
           code='KO',total=total[1L]),.(date2,date1)])[order(date2)]

使用
data.table
,您可以使用
rbind
rbind(datas,setDT(datas)[,list(eff=total[1L]-sum(eff),code='KO',total=total[1L]),(date2,date1)],[order(date2)]
谢谢akrun,非常好的解决方案,data.table很漂亮,我应该了解它。。虽然我在这个项目中使用dplyr处理所有的数据争用,而且我的所有对象都是tbl,但是我必须使用gn
as.date.frame
“unclass”。如果我用更好的data.table解决方案切换计算类型,会有麻烦吗?(在回到dplyr函数之后,我没有时间将所有代码更改为data.table)感谢您的反馈。没关系。我在评论中提到了这一点,因为您正在寻找一个只有dplyr的解决方案。您的代码看起来不错,不过将
data.table
命令转换为
dplyr
可能更容易。可能是上述数据的
dplyr
等效代码。表将是
datas%%>%groupby(date2,date1)%%>%summary(eff=total[1L]-sum(eff),code='KO',total=total[1L])%%>%bind\u行数(,datas)%%>%arranged(date2,code)
谢谢!我想我将使用您的dplyr解决方案来避免对象类型的问题。作为回答,我很乐意接受。
datas2 <- data.frame(date2 = c(rep(seq(Sys.Date() - 2, Sys.Date(), by = "day"), each = 2), 
                              rep(seq(Sys.Date() - 1, Sys.Date(), by = "day"), each = 2)), 
                    date1 = c(rep(Sys.Date() - 3, 6), rep(Sys.Date() - 2, 4)), 
                    code = c(rep(LETTERS[1:2], 3), rep(LETTERS[1:2], 2)), 
                    eff = c(50, 30, 20, 10, 20, 20, 10, 20, 30, 40), 
                    total = 100)
> datas2
        date2      date1 code eff total
1  2015-07-25 2015-07-24    A  50   100
2  2015-07-25 2015-07-24    B  30   100
3  2015-07-26 2015-07-24    A  20   100
4  2015-07-26 2015-07-24    B  10   100
5  2015-07-27 2015-07-24    A  20   100
6  2015-07-27 2015-07-24    B  20   100
7  2015-07-26 2015-07-25    A  10   100
8  2015-07-26 2015-07-25    B  20   100
9  2015-07-27 2015-07-25    A  30   100
10 2015-07-27 2015-07-25    B  40   100
 library(dplyr)
 datas %>% 
   group_by(date2, date1) %>% 
   summarise(eff=total[1L]-sum(eff), code='KO', total=total[1L]) %>%
   bind_rows(., datas) %>%
   arrange(date2,code) 
 library(data.table)
 rbind(datas,setDT(datas)[, list(eff=total[1L]-sum(eff),
           code='KO',total=total[1L]),.(date2,date1)])[order(date2)]