如何为一列增加不同列的值

时间:2019-09-26 19:01:49

标签: r dataframe

假设我有

SAMPN      PERNO     loop     car   bus   walk    mode
  1          1         1        3.4   2.5  1.5     1
  1          1         1        3      2   1       2
  1          1         1        4      2   5       3
  1          1         2        14     1   3       1
  1          1         2        5      8   2       1
  2          1         1        1      5   5       3
  2          1         1        9      4   3       3

模式列与汽车和步行交叉。

mode==1    walk
mode==2    car
mode==3    bus

SAMPN是家庭,PERNO成员的家庭索引,每个人的环游。我想在每个循环中添加每个家庭中每个人的模式价值。

例如在第一家庭SAMPN==1第一人称PERNO==1中,我们有3行用于第一次旅行loop==1。在此行中,第一行的模式是步行(mode==1),第二行的模式是汽车(mode==2),第三行的模式是公共汽车(mode==3

所以我将第二排的汽车和第三排的巴士3.4 + 2 + 5 = 10.4添加第一行的步行路程。对其他人一样

输出:

SAMPN      PERNO     loop     car   bus   walk    mode   utility
  1          1         1        3.4   2.5  1.5     1   10.4
  1          1         1        3      2   1       2   10.4
  1          1         1        4      2   5       3   10.4
  1          1         2        14     1   3       1   19
  1          1         2        5      8   2       1   19
  2          1         1        1      5   5       3   8
  2          1         1        9      4   3       3   8

2 个答案:

答案 0 :(得分:1)

df %>%
  mutate(utility = case_when(mode == 1 ~ car,   # using the order in the example,
                             mode == 2 ~ bus,   #   not the order in the table
                             mode == 3 ~ walk,
                             TRUE ~ 0)) %>%
  count(SAMPN, PERNO, loop, wt = utility, name = "utility")

## A tibble: 3 x 4
#  SAMPN PERNO  loop utility
#  <int> <int> <int> <dbl>
#1     1     1     1  10.4
#2     1     1     2  19  
#3     2     1     1   8 

或者,要获得确切的输出:

df %>%
  mutate(utility= case_when(mode == 1 ~ car,
                            mode == 2 ~ bus,
                            mode == 3 ~ walk,
                            TRUE ~ 0)) %>%
  group_by(SAMPN, PERNO, loop) %>%
  mutate(utility = sum(utility))

## A tibble: 7 x 8
## Groups:   SAMPN, PERNO, loop [3]
#  SAMPN PERNO  loop   car   bus  walk  mode utility
#  <int> <int> <int> <dbl> <dbl> <dbl> <int> <dbl>
#1     1     1     1   3.4   2.5   1.5     1  10.4
#2     1     1     1   3     2     1       2  10.4
#3     1     1     1   4     2     5       3  10.4
#4     1     1     2  14     1     3       1  19  
#5     1     1     2   5     8     2       1  19  
#6     2     1     1   1     5     5       3   8  
#7     2     1     1   9     4     3       3   8 

答案 1 :(得分:1)

这里是使用base R的选项。创建一个与名为“ mode”的命名列名称(“ nm1” 0,然后cbind与行索引)匹配的列索引,从数据集中提取相应的元素,使用ave来获得{ 1}}按“ SAMPN”分组,并在“循环”列中将其分配给“实用程序”

sum

数据

nm1 <- setNames(names(df1)[4:6], 1:3)[as.character(df1$mode)]
i1 <- cbind(seq_len(nrow(df1)), match(nm1, names(df1)))    
df1$utility <- ave(df1[i1], df1$SAMPN, df1$PERNO, df1$loop, FUN = sum)
df1$utility
#[1] 10.4 10.4 10.4 19.0 19.0  8.0  8.0