R: Разделите столбец Y на Z с абсолютным (положительным) выводом, затем суммируйте вывод на уникальное значение для столбца X - PullRequest
1 голос
/ 28 апреля 2020

для каждого jobtask Я пытаюсь разделить value на weight с двумя отдельными столбцами для вычисления значений +1 и значений -1. Для outputnegative мне бы понадобились абсолютные (положительные) значения.

Имея это, я бы хотел еще раз добавить еще 2 столбца, которые на значение для occupation (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)

Желаемый результат ниже:

   occupation jobtask value weight outputpos outputneg occupationpos occupationneg
1           a       1     1     95      0.95                    1.76          0.65
2           a       2     1     81      0.81                    1.76          0.65
3           a       3     0     97                              1.76          0.65
4           a       4    -1     65               -0.65          1.76          0.65
5           b       5    -1     43               -0.43          0.43          1.22
6           b       6     0     92                              0.43          1.22
7           b       7    -1     89               -0.89          0.43          1.22
8           b       8     1     43      0.43                    0.43          1.22
9           c       9    -1     58               -0.58          0.99          0.58
10          c      10     1     99      0.99                    0.99          0.58
11          c      11     0     35                              0.99          0.58
12          c      12     0     69                              0.99          0.58

Дополнительное дополнение для исправления нескольких лет. В df каждая строка равна одному году, поэтому «сумма» для этого определенного c занятия теперь составляет 5,42, тогда как она должна быть 0,95 + 0,81 = 1,76, как это было в примере выше. Каждый jobtask имеет различное число year, поэтому нельзя просто разделить его на одно число, чтобы учесть количество лет. Есть предложения?

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

1 Ответ

1 голос
/ 28 апреля 2020

Сначала можно преобразовать типы столбцов в число c с помощью type.convert, затем создать столбец «output», разделив «weight» на 100, а затем с помощью case_when создать «outputpos», «outputneg» основываясь на значении 1 или -1, сгруппированных по «занятию», получите sum для «output», где «value» равно 1, а «value» равно -1, чтобы создать «ission_pos »,« creation_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
...