考虑R中的以下数据框:
TYPE VARIAVEL VALOR
A OPER_RELAC_VARIAVEL1 100
A OPER_RELAC_VARIAVEL2 200
A OPER_RELAC_VARIAVEL3 300
B OPER_RELAC_VARIAVEL1 100
B OPER_RELAC_VARIAVEL2 200
B OPER_RELAC_VARIAVEL3 300
A CLI_RELAC_VARIAVEL1 450
A CLI_RELAC_VARIAVEL2 320
A CLI_RELAC_VARIAVEL3 110
我想根据VALOR
和VARIAVEL
的根来考虑每个TYPE
的相关性。我没有包含VARIAVEL
根的列,但它会在此示例中的第二个_
(OPER_RELAC
和CLI_RELAC
之前完成。
预期结果是:
TYPE VARIAVEL VALOR RELEVANCE
A OPER_RELAC_VARIAVEL1 100 0.167
A OPER_RELAC_VARIAVEL2 200 0.333
A OPER_RELAC_VARIAVEL3 300 0.500
B OPER_RELAC_VARIAVEL1 100 0.167
B OPER_RELAC_VARIAVEL2 200 0.333
B OPER_RELAC_VARIAVEL3 300 0.500
A CLI_RELAC_VARIAVEL1 450 0.511
A CLI_RELAC_VARIAVEL2 320 0.364
A CLI_RELAC_VARIAVEL3 110 0.125
例如,450表示类型A
和根变量CLI_RELAC
的总数的51.1%。
我完成了这一系列命令:
1)使用库stringr
dados$VARIAVEL_MAE <- str_match(dados$VARIAVEL, "^([^_]+[_][^_]+)")[,2]
感谢R:how to get grep to return the match, rather than the whole string
2)在新数据框中汇总通过这个新的新专栏
汇总的总数TOTAIS <- aggregate(VALOR ~ Type + VARIAVEL_MAE, data = dados, sum)
names(TOTAIS) <- c('Type', 'VARIAVEL_MAE', 'TOTAL')
3)使用建议的here
合并这两个数据帧dados <- merge(TOTAIS, dados, by = c('Type', 'VARIAVEL_MAE'))
dados$RELEVANCIA <- dados$VALOR / dados$TOTAL;
有更明智的方法吗或我确实需要这些步骤?
我的问题是因为在R中,我所做的一切总是可以用更快更小的东西代替。
答案 0 :(得分:2)
在OP的示例中,我们可以拆分_
而不是使用正则表达式:
library(data.table)
setDT(DT)
DT[, paste0("vnome", 1:3) := tstrsplit(VARIAVEL, "_")]
DT[, z := VALOR/sum(VALOR), by=.(TYPE, vnome1, vnome2)]
TYPE VARIAVEL VALOR vnome1 vnome2 vnome3 z
1: A OPER_RELAC_VARIAVEL1 100 OPER RELAC VARIAVEL1 0.1666667
2: A OPER_RELAC_VARIAVEL2 200 OPER RELAC VARIAVEL2 0.3333333
3: A OPER_RELAC_VARIAVEL3 300 OPER RELAC VARIAVEL3 0.5000000
4: B OPER_RELAC_VARIAVEL1 100 OPER RELAC VARIAVEL1 0.1666667
5: B OPER_RELAC_VARIAVEL2 200 OPER RELAC VARIAVEL2 0.3333333
6: B OPER_RELAC_VARIAVEL3 300 OPER RELAC VARIAVEL3 0.5000000
7: A CLI_RELAC_VARIAVEL1 450 CLI RELAC VARIAVEL1 0.5113636
8: A CLI_RELAC_VARIAVEL2 320 CLI RELAC VARIAVEL2 0.3636364
9: A CLI_RELAC_VARIAVEL3 110 CLI RELAC VARIAVEL3 0.1250000
在更一般的情况下,OP提到&#34;在第二个_
&#34;之前的所有内容,我们可以使用来自另一个Q&amp; A的@akrun's approach(假设{{1}不包含空格):
VARIAVEL
数据:
DT[, c("vroot", "vseq") :=
tstrsplit(sub('(^[^_]+_[^_]+)_(.*)$', '\\1 \\2', VARIAVEL), ' ')]
DT[, z := VALOR/sum(VALOR), by=.(TYPE, vroot)]
TYPE VARIAVEL VALOR vroot vseq z
1: A OPER_RELAC_VARIAVEL1 100 OPER_RELAC VARIAVEL1 0.1666667
2: A OPER_RELAC_VARIAVEL2 200 OPER_RELAC VARIAVEL2 0.3333333
3: A OPER_RELAC_VARIAVEL3 300 OPER_RELAC VARIAVEL3 0.5000000
4: B OPER_RELAC_VARIAVEL1 100 OPER_RELAC VARIAVEL1 0.1666667
5: B OPER_RELAC_VARIAVEL2 200 OPER_RELAC VARIAVEL2 0.3333333
6: B OPER_RELAC_VARIAVEL3 300 OPER_RELAC VARIAVEL3 0.5000000
7: A CLI_RELAC_VARIAVEL1 450 CLI_RELAC VARIAVEL1 0.5113636
8: A CLI_RELAC_VARIAVEL2 320 CLI_RELAC VARIAVEL2 0.3636364
9: A CLI_RELAC_VARIAVEL3 110 CLI_RELAC VARIAVEL3 0.1250000