두 열 선택을 기반으로 데이터 프레임의 집합 행을 한 행으로 축소하는 가장 좋은 방법을 결정하려고합니다.
예를 들면 :
| State |Fatalities|Injuries|Dmg |Dmg|year|eventType| PropExp | CropExp |
| ------|----------|--------|------|---|----|---------|---------|---------|
| WA | 1 | 100 |25.00 |0 |1971|HAIL |1000000 |1 | 0 |
| WA | 6 | 200 |25.00 |0 |1972|TORNADO |1000000 |1 | 1 |
| WA | 2 | 300 |25.00 |0 |1973|SNOW |1000000 |1 | 0 |
| WA | 6 | 900 |65.00 |0 |1973|TORNADO |1000000 |1 | 1 |
| WA | 4 | 300 |25.00 |0 |1973|TORNADO |1000000 |1 | 0 |
| WA | 0 | 900 |65.00 |0 |1972|TORNADO |1000000 |1 | 1 |
의도는 이벤트 유형별로 매년 행을 병합하고 추가하는 것입니다 ... 따라서 1973 TORNADO 행을 하나의 행으로 축소합니다. 선택한 행 데이터를 추가하고 새로운 병합 데이터 행을 생성합니다.
| State |Fatalities|Injuries|Dmg |Dmg|year|eventType| PropExp | CropExp |
| ------|----------|--------|------|---|----|---------|---------|---------|
| WA | 1 | 100 |25.00 |0 |1971|HAIL |1000000 |1 | 0 |
| WA | 6 | 200 |25.00 |0 |1972|TORNADO |1000000 |1 | 1 |
| WA | 2 | 300 |25.00 |0 |1973|SNOW |1000000 |1 | 0 |
| WA | 10 | 1200 |90.00 |0 |1973|TORNADO |1000000 |1 | 1 |
| WA | 0 | 900 |65.00 |0 |1972|TORNADO |1000000 |1 | 1 |
참고 : 저는 이전에 완료 한 Coursera Reproducible Research 과정의 예제 데이터 세트를 사용하고 있습니다. 질문은 코스 등과 관련이 없습니다. 다른 데이터 세트를 축소하려고 시도하고 있으며 R에서 깔끔하게 수행되는 방법을 알고 싶습니다.
내가 무엇을 놓치고 있습니까?
모든 도움을 감사하게 받고 감사했습니다.
dplyr
댓글에 언급 된 @Khashaa 솔루션 외에도 기본 R 오프 코스에서도이 작업을 수행 할 수 있습니다.
aggregate(cbind(Fatalities, Injuries, Dmg, Dmg.1, PropExp, CropExp) ~ State + year + eventType, data = df, sum)
이것은 제공합니다 :
State year eventType Fatalities Injuries Dmg Dmg.1 PropExp CropExp
1 WA 1971 HAIL 1 100 25 0 1000000 1
2 WA 1973 SNOW 2 300 25 0 1000000 1
3 WA 1972 TORNADO 6 1100 90 0 2000000 2
4 WA 1973 TORNADO 10 1200 90 0 2000000 2
또는 대안으로 다음을 사용할 수도 있습니다 data.table
.
library(data.table)
setDT(df)[, lapply(.SD, sum), by=.(State, year, eventType)]
동일한 결과를 제공합니다.
양자의 단점 data.table
용액과 dplyr
함께 용액을 summarize_each
모든 컬럼이 합산되어있다. 원하는 출력으로 판단하면 PropExp
& CropExp
합계를 원하지 않습니다 . 당신은으로 요약 할 수있다 열 표시하여 그것을 달성 할 수 .SDcols
있는 data.table
이나와 select
의를 dplyr
:
# data.table
setDT(df)[, lapply(.SD, sum),
by=.(State, year, eventType),
.SDcols=c("Fatalities","Injuries","Dmg")]
# dplyr
df %>% group_by(State, year, eventType) %>%
summarise_each(funs(sum), -PropExp, -CropExp, -Dmg.1)
둘 다 결과 :
State year eventType Fatalities Injuries Dmg
1: WA 1971 HAIL 1 100 25
2: WA 1972 TORNADO 6 1100 90
3: WA 1973 SNOW 2 300 25
4: WA 1973 TORNADO 10 1200 90
물론 기본 R에서도이 작업을 수행 할 수 있습니다.
aggregate(cbind(Fatalities, Injuries, Dmg) ~ State + year + eventType, data = df, sum)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다