나는 수년 동안 많은 그룹에 대한 지출과 함께 R에 대한 데이터 프레임을 가지고 있습니다. 기본적으로 다음과 같이 보입니다 (회색 열).
전년도와 다음 해의 지출을 기준으로 노란색 열에 표시된 것처럼 연도 별 지출 평균을 추가하고 싶습니다.
이 코드를 사용해 보았습니다.
expenditures %>%
group_by(id) %>%
mutate(
avg_exp = ifelse(year != 2011 && year != 2008,
mean(c(
Spending[Year %in% (Year-1)],
Spending[Year %in% (Year+1)])),
NA)) %>%
View()
그러나 나는 모든 종류의 이상한 숫자를 유지합니다. 우선, ifelse는 else 조건 만 적용합니다. 심지어 Year 열이 정수로 설정되어있는 경우에도 마찬가지입니다. 둘째, else 조건에서도 평균을 계산하도록 설정하더라도 모든 행 (각 그룹의)이 동일한 숫자로 채워 져서 어디서 왔는지 모르겠습니다 (일반 평균에 가깝습니다). 그룹의 동일하지 않음).
이 작업을 수행하는 간단한 방법이 있습니까? 감사
우리는 사용할 수 +
의 lag
및 lead
'ID'로 그룹화 한 후 2로 나눈다. default
모두 옵션 lead
과는 lag
되어 NA
있으므로, 그 첫 번째와 마지막 '년도'될 것 NA
'평균'열에서
library(dplyr)
expenditures %>%
group_by(ID) %>%
mutate(Mean = (lead(Spending) + lag(Spending))/2)
-산출
# A tibble: 12 x 4
# Groups: ID [3]
# ID Year Spending new
# <int> <int> <dbl> <dbl>
# 1 1 2008 55 NA
# 2 1 2009 57 60
# 3 1 2010 65 63.5
# 4 1 2011 70 NA
# 5 2 2008 80 NA
# 6 2 2009 87 85
# 7 2 2010 90 91
# 8 2 2011 95 NA
# 9 3 2008 120 NA
#10 3 2009 123 125
#11 3 2010 130 129
#12 3 2011 135 NA
또는 다른 옵션은 출력 에 cbind
대한 lead/lag
다음 사용rowMeans
expenditures %>%
group_by(ID) %>%
mutate(Mean = rowMeans(cbind(lead(Spending), lag(Spending))))
expenditures <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L), Year = c(2008L, 2009L, 2010L, 2011L, 2008L, 2009L, 2010L,
2011L, 2008L, 2009L, 2010L, 2011L), Spending = c(55, 57, 65,
70, 80, 87, 90, 95, 120, 123, 130, 135)), class = "data.frame",
row.names = c(NA,
-12L))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다