R에서 일치하는 열 값을 기반으로 행 합계? [복제]
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
이 시도:
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
다음을 통한 기본 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")