R:用绝对(正)输出将列Y除以Z,然后对列X的每个唯一值的输出求和

R:用绝对(正)输出将列Y除以Z,然后对列X的每个唯一值的输出求和,r,math,data-manipulation,integer-arithmetic,R,Math,Data Manipulation,Integer Arithmetic,对于每个作业任务我都试图用值除以权重,两列分别用于计算+1值和-1值。对于outputnegative,我特别需要绝对(正)值 有了这一点,我想再添加两列,occulation(a/b/c)的每个值加上outputpositive和outputnegative。我似乎无法理解,任何帮助都将不胜感激 occupation <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c") jobtask <- c("1",

对于每个
作业任务
我都试图用
除以
权重
,两列分别用于计算+1值和-1值。对于
outputnegative
,我特别需要绝对(正)值

有了这一点,我想再添加两列,
occulation
(a/b/c)的每个值加上
outputpositive
outputnegative
。我似乎无法理解,任何帮助都将不胜感激

occupation <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
jobtask <- c("1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12")
value <- c("1", "1", "0", "-1", "-1", "0", "-1", "1", "-1", "1", "0", "0")
weight <- c("95", "81", "97", "65", "43", "92", "89", "43", "58", "99", "35", "69")

df <- data.frame(occupation, jobtask, value, weight)
额外增加,以修复多年。在df中,每一行是一年,因此该特定职业的“总和”现在是5.42,而它应该是0.95+0.81=1.76,就像上面的例子一样。每个
作业任务
都有不同的
年数
,因此不能简单地除以一个数字来计算年数。有什么建议吗

 occupation jobtask year value weight outputpos outputneg occupationpos occupationneg
1          a       1 2015     1     95      0.95                    5.42              
2          a       1 2016     1     95      0.95                    5.42             
3          a       1 2017     1     95      0.95                    5.42             
4          a       1 2018     1     95      0.95                    5.42             
5          a       2 2015     1     81      0.81                    5.42             
6          a       2 2016     1     81      0.81                    5.42             ```


我们可以首先使用
type将列类型转换为数值。convert
,然后通过将“weight”除以100来创建“output”列,然后使用
case\u,当
创建“outputpos”、“outputneg”时,根据值1或-1,按“占领”分组,得到“output”的
和,其中“value”为1,“value”是-1,用于创建“occulation\u pos”、“occulation\u neg”

library(dplyr)
df <- type.convert(df, as.is = TRUE)
df %>% 
   mutate(output = weight/100, 
          outputpos = case_when(value == 1 ~ output), 
          outputneg = case_when(value == -1 ~ -1 *output)) %>% 
   group_by(occupation) %>% 
   mutate(occupation_pos = sum(output[value == 1]),
          occupation_neg = sum(output[value == -1])) %>%
   select(-output)
# A tibble: 12 x 8
# Groups:   occupation [3]
#   occupation jobtask value weight outputpos outputneg occupation_pos occupation_neg
#   <chr>        <int> <int>  <int>     <dbl>     <dbl>          <dbl>          <dbl>
# 1 a                1     1     95      0.95    NA               1.76          0.65 
# 2 a                2     1     81      0.81    NA               1.76          0.65 
# 3 a                3     0     97     NA       NA               1.76          0.65 
# 4 a                4    -1     65     NA       -0.65            1.76          0.65 
# 5 b                5    -1     43     NA       -0.43            0.43          1.32 
# 6 b                6     0     92     NA       NA               0.43          1.32 
# 7 b                7    -1     89     NA       -0.89            0.43          1.32 
# 8 b                8     1     43      0.43    NA               0.43          1.32 
# 9 c                9    -1     58     NA       -0.580           0.99          0.580
#10 c               10     1     99      0.99    NA               0.99          0.580
#11 c               11     0     35     NA       NA               0.99          0.580
#12 c               12     0     69     NA       NA               0.99          0.580
库(dplyr)
df%
变异(输出=重量/100,
outputpos=case_(值==1~输出),
outputneg=case_当(值==-1~-1*输出))%>%
组别(职业)%>%
变异(占位=和(输出[值==1]),
职业=总和(输出[值==-1]))%>%
选择(-output)
#一个tibble:12x8
#组别:职业[3]
#占用作业任务值权重输出pos输出负占用\u pos占用\u负
#                                            
#1 a 1 95 0.95 NA 1.76 0.65
#2 a 2 1 81 0.81 NA 1.76 0.65
#3 a 3 0 97 NA 1.76 0.65
#4a 4-165na-0.651.760.65
#5B5-143NA-0.430.431.32
#6 b 6 0 92 NA 0.43 1.32
#7b7-189na-0.890.431.32
#8b143 0.43na 0.431.32
#9c9-158na-0.5800.990.580
#10C1990.99NA0.990.580
#11 c 11 0 35 NA 0.99 0.580
#12C12069Na0.990.580

已实施和正在工作;非常感谢。投票结果也一样!好的,我想你想要的是
分组(年)
而不是
分组(职业)
即2015年的第一排+第五排。我在想你想按职业分组hi@akrun,非常感谢你的回答。我现在有一个问题,那就是我测量多年(长格式,例如5年5行)。因此,总和现在是所有年份的总和,尽管我需要将总和除以特定
任务id
的年数。也就是说,
year
每个唯一任务id的值不同于2到5年。我该怎么做?@Marc Marijn数据集中的“year”列在哪里。您是否需要
按(职业,年份)%>%分组,然后创建职业位置,负列?您好@akrun,我已经编辑过了。谢谢你调查此事@Marc Marijn您是否需要
分组依据(职业、工作任务)
其余部分仍然是sameI在底部添加的新df,您可以在那里看到年份。当按(职业、工作任务)分组时,它仍然每年汇总一次(而每个任务的输出值仅为1,不取决于年份)
library(dplyr)
df <- type.convert(df, as.is = TRUE)
df %>% 
   mutate(output = weight/100, 
          outputpos = case_when(value == 1 ~ output), 
          outputneg = case_when(value == -1 ~ -1 *output)) %>% 
   group_by(occupation) %>% 
   mutate(occupation_pos = sum(output[value == 1]),
          occupation_neg = sum(output[value == -1])) %>%
   select(-output)
# A tibble: 12 x 8
# Groups:   occupation [3]
#   occupation jobtask value weight outputpos outputneg occupation_pos occupation_neg
#   <chr>        <int> <int>  <int>     <dbl>     <dbl>          <dbl>          <dbl>
# 1 a                1     1     95      0.95    NA               1.76          0.65 
# 2 a                2     1     81      0.81    NA               1.76          0.65 
# 3 a                3     0     97     NA       NA               1.76          0.65 
# 4 a                4    -1     65     NA       -0.65            1.76          0.65 
# 5 b                5    -1     43     NA       -0.43            0.43          1.32 
# 6 b                6     0     92     NA       NA               0.43          1.32 
# 7 b                7    -1     89     NA       -0.89            0.43          1.32 
# 8 b                8     1     43      0.43    NA               0.43          1.32 
# 9 c                9    -1     58     NA       -0.580           0.99          0.580
#10 c               10     1     99      0.99    NA               0.99          0.580
#11 c               11     0     35     NA       NA               0.99          0.580
#12 c               12     0     69     NA       NA               0.99          0.580