2017-11-29 14 views
0

dataframe에는 Balance, Balance1, Balance2, ..., Balance36의 미결제 잔액이 있습니다. Balance1data.frame에서 차이점 또는 델타 열을 어떻게 동적으로 생성합니까?

방법은 아래의 방법으로 단순화 할 수 있습니다 -

나는 Balance2은 = 매달 사이의 델타, 즉 Delta2에 대한 열을 추가합니다.

dataset$delta1 = apply(dataset[, c("Balance1","Balance")], 1, function(x){x[2]-x[1]}) 
dataset$delta2 = apply(dataset[, c("Balance2","Balance1")], 1, function(x){x[2]-x[1]}) 
... 
dataset$delta35 = apply(dataset[, c("Balance35","Balance34")], 1, function(x){x[2]-x[1]}) 
dataset$delta36 = apply(dataset[, c("Balance36","Balance35")], 1, function(x){x[2]-x[1]}) 

답변

0

단 한 개의 라이너로 귀결됩니다. 먼저 데이터 세트 이름을 짧게 지정하고 df을 일반적인 이름으로 지정하십시오. 그런 다음 직접 빼기를 사용하십시오.

df$delta1 <- df[,"Balance1"] - df[,"Balance"] 
df$delta2 <- df[,"Balance2"] - df[,"Balance1"] 
... 
df$delta35 <- df[,"Balance35"] - df[,"Balance34")] 
df$delta36 <- df[,"Balance36"] - df[,"Balance35")] 

그러나 전체 계산이 정기적 인 구조를 가지고 있기 때문에, 우리가 정말 유일한 차이점 Nx36 배열을 생성에 대해 얘기하고

, 그래서 숫자 열 인덱스를 사용 : 서로 하나의 열을 빼 apply()를 호출하는 제로 필요가있다. "잔액 *"열 인덱스가 (50:85)이고 delta_cols가 100 : 135 또는 그 이상인 경우를 가정 해보십시오. 그런 다음의 LHS에 대한 지표 "밸런스 *"빼기 balance_lhs <- (50:84)하고 RHS 지수는 (51:85)을, 또는 단지 ((50:84)+1) (기억이 R에 추가 벡터화와 같은 대부분의 통신 사업자)

그래서 Nx36 배열이 바로 원 -에 의해 생성 될 수있다 라이너 :

df[,delta_cols] <- df[,(balance_lhs+1)] - df[,balance_lhs] 

그리고 당신은 코드에서 마법 숫자 열 인덱스를 방지하기 위해, 프로그램 delta_cols <- which(colnames(df) == c("delta1",...,"delta36")을 계산할 수 있습니다.

+0

"델타"열 이름이 이미 없으면 먼저 만들거나 동일한 한 줄의 코드에서 dynmaically 할 수 있습니다. 즉 원래의 df에는 델타 열이 아닌 월간 잔액 열이 포함됩니다. – Adam

+0

@Adam : cols가 존재하지 않는다면, 예를 들어'df [, c ("delta1", ..., "delta36")] <- ...'를 동시에 할당하면서 생성 할 수 있습니다. 이는 인덱스가 아닌 column-name별로 존재하지 않는 열을 참조 할 때 작동합니다. 또는 숫자로 된 열 - 색인을 사용하여 df를 생성하는 것이 더 쉬울 수도 있습니다. 마지막에 항상'colnames (df) '를 지정할 수 있습니다. – smci

0

lapply을 사용하여 한 줄에 36 개의 모든 비교에 대한 델타를 계산하십시오.

# Sample data (37 columns, labelled Balance, Balance1, ...) 
set.seed(2017); 
df <- as.data.frame(matrix(runif(37 * 100), ncol = 37)); 
colnames(df) <- paste("Balance", c("", seq(1:36)), sep = ""); 

# List of difference vectors (36 distance vectors, labelled delta1, ...) 
lst <- lapply(2:ncol(df), function(i) df[, i] - df[, i - 1]); 
names(lst) <- paste("delta", seq(1:36), sep = ""); 

# Combine with original dataframe 
df <- cbind.data.frame(
    df, 
    as.data.frame(lst)); 
+0

'lapply()를 호출하면 행렬을 직접 빼는 것보다 느리다. – smci

+0

@smci True. 내 솔루션을 올리 자마자 나중에 직접 추가 한 직접 매트릭스 색인은 포함되지 않았습니다. –