2016-09-19 2 views
0

여러 열에 대한 자르기 값으로 합계를 계산하고 싶습니다. 각 열에 대해이 작업을 수동으로 수행하는 방법을 알고 있지만 모든 열의 기능을 자동화하는 알맞은 방법을 찾는 데 어려움을 겪고 있습니다. 일반적으로 lapply를 사용하여 함수를 사용하지만 data.table을 사용하여이를 선택했으며 char 값을 사용하는 방법을 파악할 수 없었습니다.다수의 열에 대한 파리 인자에 의한 요약

제가

data.table(col.name=c("v1","v2"), low=c(1185.3074,1175.7261), high=c(1175.726,350.3937)) 
같이, 각각의 카테고리 나 각 열 변수에 대한 첫 번째 열 및 범주로 다음 열 data.table 매트릭스/대한 총합 data.tables 목록 혹시나

MWE

rm(list=ls()) 
if(!require(data.table)) { install.packages("data.table"); require(data.table)} 
set.seed(123) 
DT<-data.table(v1=runif(50,10,50),v2=runif(50,10,50)) 

DT[,sum(v1, na.rm = T), by=cut(DT[,v1], breaks=c(0,25,50), labels = c("low", "high"))] 
DT[,sum(v2, na.rm = T), by=cut(DT[,v2], breaks=c(0,25,50), labels = c("low", "high"))] 

답변

3

나는 하나의 표준 방법은 두 번 바꿀하는 것 같아요

dcast(
    melt(DT), 
    variable ~ cut(value, c(0,25,50), c("low","high")), 
    fun = sum 
) 

# variable  low  high 
# 1:  v1 323.2453 1216.937 
# 2:  v2 331.0626 1122.991 

melt가 "긴"고쳐; dcast은 "와이드"로 되돌아갑니다. 재미를 위해

1

당신은 같은 것을 정확히 무엇을 생각하고 싶지만 결과는 가까이하고 요약 프로세스를 자동화하지 (본질적으로는 루프가 데이터 테이블의 모든 열을 여전히 시도하고 요약 할 수 있습니다 각각 개별적으로) :

DT[, c(lapply(.SD, function(col) tapply(col, cut(col, breaks = c(0, 25, 50)), FUN=sum)), 
     list(category = c('low', 'high')))] 

#   v1  v2 category 
#1: 323.2453 331.0626  low 
#2: 1216.9367 1122.9914  high 
1

베이스 R 솔루션 :

do.call(rbind, lapply(DT, function(x) tapply(x, cut(x, 0:2*25), sum))) 

#  (0,25]  (25,50] 
#v1 323.2452605 1216.936685 
#v2 331.0626328 1122.991399 
0

나는 데이터 테이블로 시작,하지만 난 tidyr과 dplyr 내 나중에 목적에 더 적합 생각합니다. 명명 기능을 유지하면서 동시에 여러 기능을 사용하여 요약하는 것이 더 쉬워 보입니다. 어쨌든, 같은 문제에 대한 두 번째 해법을 갖는 것이 항상 좋은 일이며, 나는 나의 데이터를 재 형성하기 위해 뾰족한 부분을 필요로했다.

if(!require(dplyr)) { install.packages("dplyr"); require(dplyr)} 
if(!require(tidyr)) { install.packages("tidyr"); require(tidyr)} 
DT %>% 
    gather(variable, value) %>% 
    mutate(segment = cut(value, c(0,25,50), c("low","high"))) %>% 
    group_by(variable,segment) %>% 
    summarise(sum=sum(value)) %>% 
    spread(segment, sum) 
관련 문제