如何为3组增加一些列值?

时间:2019-09-23 13:57:47

标签: r dataframe

我有3列:SAMPN,PERNO,循环。以及与3种模式相对应的实用程序。角豆和步行 我想添加具有相同SAMPN,PERNO,循环的行的实用程序。用于car.car,bus.bus,walk.walk,walk.bus和bus.walk

示例

   SAMPN PERNO  PLANO loop      walk               car               bus            MODE1
  <chr>   <fct> <fct> <fct> <chr>              <chr>             <chr>              <fct>
1 "    4" 1     " 2"  2     -0.990765697239748 2.09989661853416  -0.92177603128108  2    
2 "    4" 1     " 7"  2     0.11385013993979   1.09436996098927  -0.534987482042767 2    
3 "    4" 2     " 2"  2     0.500507525721786  0.924888419124695 -0.376370439308976 2    
4 "    4" 2     " 7"  2     -0.299078042202768 1.54226436622111  -0.289562610169849 2    
5 "    6" 1     " 2"  2     -0.991897610390741 1.58114646818508  -0.973443199067661 2    
6 "    6" 1     " 3"  2     -1.05376527366975  1.61719511863015  -0.832468269682489 2 

在SAMPN 4中,第一行的第二行具有相同的SAMPN,PERNO和循环,因此我将添加这两行的交叉实用程序。

car.car 2.09989661853416+1.09436996098927   = 3.194267
bus.bus -0.92177603128108+-0.534987482042767 =-1.456764
walk.walk -0.990765697239748+0.11385013993979=-0.8769156
walk.bus -0.92177603128108+-0.534987482042767=-1.456764
bus.walk -0.92177603128108+ 0.11385013993979 =-0.8079259

与其他人相同。

我知道是否要在每行中添加值,我可以使用它:但是如何在不同的行中添加实用程序?

kl<-r %>%
+   group_by(SAMPN, PERNO,loop) %>%
+   mutate(car.car = car+car, walk.walk=walk+walk, bus.bus=bus+bus, walk.bus=walk+bus, bus.walk=bus+walk)

数据:

structure(list(SAMPN = c("    4", "    4", "    4", "    4", 
"    6", "    6"), PERNO = structure(c(1L, 1L, 2L, 2L, 1L, 1L
), .Label = c("1", "2", "3", "4", "5", "6", "7"), class = "factor"), 
    PLANO = structure(c(1L, 6L, 1L, 6L, 1L, 2L), .Label = c(" 2", 
    " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "20", "21", "23", 
    "24"), class = "factor"), loop = structure(c(2L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("1", "2", "3", "4", "5", "6", "7", 
    "8"), class = "factor"), walk = c("-0.990765697239748", "0.11385013993979", 
    "0.500507525721786", "-0.299078042202768", "-0.991897610390741", 
    "-1.05376527366975"), car = c("2.09989661853416", "1.09436996098927", 
    "0.924888419124695", "1.54226436622111", "1.58114646818508", 
    "1.61719511863015"), bus = c("-0.92177603128108", "-0.534987482042767", 
    "-0.376370439308976", "-0.289562610169849", "-0.973443199067661", 
    "-0.832468269682489"), MODE1 = structure(c(2L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("1", "2", "3", "4"), class = "factor")), row.names = c(NA, 
-6L), groups = structure(list(SAMPN = c("    4", "    4", "    6"
), PERNO = structure(c(1L, 2L, 1L), .Label = c("1", "2", "3", 
"4", "5", "6", "7"), class = "factor"), loop = structure(c(2L, 
2L, 2L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8"), class = "factor"), 
    .rows = list(1:2, 3:4, 5:6)), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

仅输出前2行:

 SAMPN PERNO  PLANO loop      car.car      bus.bus  walk.walk    walk.bus  bus.walk  MODE1

1 "    4" 1     " 2"  2    3.194267    -1.456764    -0.8769156  -1.456764  -0.8079259   2
2 "    4" 1     " 7"  2    3.194267    -1.456764    -0.8769156  -1.456764  -0.8079259   2

1 个答案:

答案 0 :(得分:2)

如果我们需要为特定的组合创建,则在group_by步骤之后,可以一一创建列

library(dplyr)
df1 %>% 
   group_by(SAMPN, PERNO, loop) %>%
   mutate_at(vars(walk:bus), as.numeric) %>%
   mutate(walk.bus = first(walk) + last(bus), 
           bus.walk = first(bus) + last(walk), 
           walk.walk = sum(walk),
           bus.bus = sum(bus), 
           car.car = sum(car))