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