R에서 일치하는 열 값을 기반으로 행 합계? [복제]

Aug 16 2020
        c1       c2       count 
 1        1        1          20
 2        2        3          50 
 3        1        4          30              

따라서 기본적으로 위의 표와 같은 데이터가 있지만 원하는 것은 각 행의 개수를 동일한 c1 값을 가진 모든 행의 개수의 합계로 나눈 새 열을 추가하여 다음과 같이 끝나는 것입니다.

        c1       c2       count    new_col
 1        1        1          20     20/50
 2        2        3          40     40/40
 3        1        4          30     30/50

보시다시피 새 열에는 행의 개수를 일치하는 c1 값을 가진 모든 개수의 합계로 나눈 값이 있습니다. 그래서 제가 시도한 것은 다음과 같습니다.

df$new_col <- df$count/sum(df[SUBSET OF ROWS THAT HAVE SAME c1 VALUE]$count)

나는 df [df $ c1 == some value]와 같은 것을 보았지만 이것은 하드 코딩 된 값처럼 작동합니다. for 루프를 사용해 볼 수도 있지만 데이터의 모든 행을 반복하는 데 시간이 너무 오래 걸리고 실행이 완료되지 않습니다. 또한 c1이 취하는 모든 값을 알지 못합니다. 나는 R을 처음 접했고 이것에 대한 매우 간단한 해결책이 있을지 모르지만 그것을 생각 해낼 수 없었습니다.

답변

3 Duck Aug 16 2020 at 04:06

이 시도:

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")

코드:

df %>% group_by(c1) %>% mutate(Sum=sum(count),NewVar=count/Sum)

산출:

# 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
2 ThomasIsCoding Aug 16 2020 at 04:20

다음을 통한 기본 R 옵션 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

또는 rowsum(댓글에서 @akrun에 의해)

> 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

데이터

> 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")