2015-02-03 2 views
1

데이터 테이블에서 루프에 의해 열을 추가 이름으로 5 열,R은 데이터 테이블과 같이 내가 가진

1 추가 : V100를 , V102, V105, V108, V112

2 각 열의 ID 및 연도별로 그룹화하여 열 이름의 값보다 작은 값을 합산합니다. 예 : V112 열의 경우 그룹화 된 값을 112보다 작게 합니다.

DT1 <- data.table(ID=rep(c(1:2),each=2), year=c(2003:2006), "100"=rep(0,4), "102"=c(2,0,0,0),"105"=c(3,2,0,0),"108"=c(3,3,2,0),"112"=rep(3,4)) 

내가 쓰기 코드를 시도했지만 알아낼 수 : 10 그래서 결과는 모양을

degree <- c(100,102,105,108,112)  
for (d in degree) 
{ 
    f_year <- function(d) {sum(DT$value <= d)} 
    DT <- DT[,d:=f_year(),by=list(ID,year)] 
} 

어떤 도움을 주시면 감사하겠습니다!

답변

3

그 무엇 lapply 사용할 수 있습니다.

degree <- c(100, 102, 105, 108, 112) 
myfun <- function(x,y) sum(y <= x) 
DT1 <- DT[, lapply(degree, myfun, value), by = .(ID, year)] 
setnames(DT1, c("ID", "year", as.character(degree))) 

결과 :

> DT1 
    ID year 100 102 105 108 112 
1: 1 2003 0 2 3 3 3 
2: 1 2004 0 0 2 3 3 
3: 2 2005 0 0 0 2 3 
4: 2 2006 0 0 0 0 3 
+0

? 더 나은 지금? – Rentrop

+1

@ Floo0, 그런 쓸모없는 의견을 무시하는 경향이 있습니다. – Arun

+0

고맙습니다 !!!!!!!!!!! – Rosa

2

그냥 다른 방법 :

cols = c(100,102,105,108,112) 
DT[, lapply(cols, function(x) sum(value <= x)), by=.(ID, year)] 
# ID year V1 V2 V3 V4 V5 
# 1: 1 2003 0 2 3 3 3 
# 2: 1 2004 0 0 2 3 3 
# 3: 2 2005 0 0 0 2 3 
# 4: 2 2006 0 0 0 0 3 

이 그럼 당신은 이름을 설정할 수 있습니다. 직접 이름을 설정하려는 경우

대신에, 당신은 먼저라는 이름의 목록을 만들 수 있습니다 : 당신은 입력 매개 변수 inbetween MEEN

named_cols = setattr(as.list(cols), 'names', cols) 
DT[, lapply(named_cols, function(x) sum(value<=x)), by=.(ID, year)] 
# ID year 100 102 105 108 112 
# 1: 1 2003 0 2 3 3 3 
# 2: 1 2004 0 0 2 3 3 
# 3: 2 2005 0 0 0 2 3 
# 4: 2 2006 0 0 0 0 3 
+0

UR 도움을 주셔서 감사합니다! – Rosa