Somando as linhas com base no valor da coluna correspondente em R? [duplicado]
c1 c2 count
1 1 1 20
2 2 3 50
3 1 4 30
Portanto, essencialmente, tenho dados como a tabela acima, mas o que quero fazer é adicionar uma nova coluna que tenha a contagem de cada linha dividida pela soma das contagens de todas as linhas com o mesmo valor c1, terminando com algo como:
c1 c2 count new_col
1 1 1 20 20/50
2 2 3 40 40/40
3 1 4 30 30/50
Como você pode ver, a nova coluna tem a contagem da linha dividida pela soma de todas as contagens com o valor c1 correspondente. Então, o que tenho tentado é algo assim:
df$new_col <- df$count/sum(df[SUBSET OF ROWS THAT HAVE SAME c1 VALUE]$count)
Eu vi algo como df [df $ c1 == algum valor,] mas isso só funcionaria como um valor codificado. Eu também poderia tentar usar um loop for, mas leva muito tempo para iterar por cada linha em meus dados e nunca termina a execução, também não sei todos os valores que c1 assume. Eu sou muito novo no R e pode haver uma solução muito simples para isso, mas ainda não fui capaz de encontrá-la.
Respostas
Experimente isto:
library(dplyr)
#Data
df <- structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")
O código:
df %>% group_by(c1) %>% mutate(Sum=sum(count),NewVar=count/Sum)
Resultado:
# A tibble: 3 x 5
# Groups: c1 [2]
c1 c2 count Sum NewVar
<int> <int> <dbl> <dbl> <dbl>
1 1 1 20 50 0.4
2 2 3 40 40 1
3 1 4 30 50 0.6
Uma opção de base R via ave
> within(df,new_col <- count/ave(count,c1,FUN = sum))
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
ou via rowsum
(por @akrun do comentário)
> within(df,new_col <- count/rowsum(count,c1)[c1])
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
Dados
> dput(df)
structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")