2016-07-02 1 views
1

5 개의 변수 (열)가있는 데이터베이스가 있습니다. 하나의 특정 열의 특정 값이 있는지 확인하기 위해 데이터 프레임을 부분 집합 화하려고합니다. 이 경우 1, 그 외에는 0을 지정하십시오. 그런 다음 결과 (1 또는 0)를 제한된 데이터 프레임의 특정 열에 붙여넣고 계속하십시오.lapply 또는 for 루프의 결과를 특정 행에 추가하는 방법

데이터 프레임은 다음과 같습니다 :

## Year Month Product Supermarket Price 
## 2015 1  67   1   10 
## 2015 1  65   1   11 
## 2015 1  69   1   15 
## 2015 2  65   2   20 
## 2015 2  67   2   25 
## 2015 2  67   3   15 
## 2015 2  69   3   12 

가 지금은 각각의 년, 월 및 슈퍼마켓에 대한 제한 및 제품 = 65가 존재하는지 확인하고 싶습니다. 그럴 경우, 새로운 변수 (열)로 제한된 행에 1을 대입하십시오. 그렇지 않은 경우, lapply 사용하여 0

내가 시도 할당 :

prueba <- function(x) 
ifelse(any(base$Product == 65), 1, 0) 
lapply(unique(base$Supermarket) & unique(base$Year) & unique(base$Month), 
        base$NewVar <- prueba) 

을하지만, 다음과 같은 결과

Error in rep(value, length.out = nrows) : 
attempt to replicate an object of type 'closure' 

다음을 가지고, 내가 만들려고 for 루프 :

for(i in unique(base$Supermarket)) { 
for(j in unique(base$Year)) 
for(h in unique(base$Month)) { 
try <- ifelse(any((filter(base, Supermarket == i, Year == j, Month == h))$Product == 65), 1, 0) 

base[base$Supermarket == i && base$Year ==j && base$Month == h,]$NewVar <- try 
} 
} 
} 

다음 결과를 얻었습니다.

Error in if (nrow(try) == 0) { : argument has zero lenght 

데이터베이스에 5 천만 개의 행이 있으므로 속도가 문제가 될 수 있습니다 (루프 대신에 lapply를 사용하려고합니다). 올바른 결과를 얻는 방법을 모르겠습니다. 다음 :

## Year Month Product Supermarket Price NewVar 
## 2015 1  67   1   10 1 
## 2015 1  65   1   11 1 
## 2015 1  69   1   15 1 
## 2015 2  65   2   20 1 
## 2015 2  67   2   25 1 
## 2015 2  67   3   15 0 
## 2015 2  69   3   12 0 

전체적인 문제를 해결하는 방법을 모르십시오. lapply를 사용할 때 "올바른"대답을 얻었지만 그 결과를 데이터 프레임의 오른쪽 행에 붙여 넣을 수 없었습니다.

미리 감사드립니다.

답변

0

우리는 base R

df1$NewVar <- with(df1, ave(Product, Year, Month, Supermarket, 
             FUN= function(x) 65 %in% x)) 
df1$NewVar 
#[1] 1 1 1 1 1 0 0 
+1

고마워요, @akrun. 제품이 포함되어야하는 이유를 알고 계십니까? 또한,이 환경에서 무엇을 하는가? (도움말을보고 R 표현식을 평가한다고하자.) 아름답고 단순함 –

+0

@LeandroZipitria 첫 번째 ie 제품 이후, 다른 모든 변수는 그룹화 변수이므로'x'는'Product 'with '는 우리가'df1 $ Product','df1 $ Year' 등을 사용할 필요가 없도록하기 위해 사용되며, 조금 더 어리 석질 수 있습니다. – akrun

+1

많은 시간을 배웠습니다. . –

2

빠른 조작을 위해 data.table 또는 dplyr을 사용해보십시오. data.table를 사용하면 간단하게 Year, Month and Supermarket 변수로 그룹화 논리 체크와 새로운 변수를 만들 수 있습니다 (원래 데이터 프레임 df라고 가정) : 상응

library(data.table) 
setDT(df)[, NewVar := as.numeric(65 %in% Product), .(Year, Month, Supermarket)] 
df 
# Year Month Product Supermarket Price NewVar 
# 1: 2015  1  67   1 10  1 
# 2: 2015  1  65   1 11  1 
# 3: 2015  1  69   1 15  1 
# 4: 2015  2  65   2 20  1 
# 5: 2015  2  67   2 25  1 
# 6: 2015  2  67   3 15  0 
# 7: 2015  2  69   3 12  0 

또는를 dplyr를 사용하여 : df <- df %>% group_by(Year, Month, Supermarket) %>% mutate(NewVar = as.numeric(65 %in% Product))

+0

감사 @Psidom에서 쉽게 할 수 있습니다 : 이것은 내가 할 줄 방법입니다! 그것은 훌륭하게 작동합니다. –

+0

제품 == 65? 이것은 옳지 않은 것처럼 보입니다. NewVar는 67, 69에 대해 1을 포함하지만 모든 값을 포함하지는 않습니다. – mkearney

+0

@Mike OP는 제품이 65 인 행 대신 제품 '65'가 들어있는 '연도, 월 및 슈퍼마켓'그룹에 레이블을 지정하려고합니다. 이것은 본질적으로 원본 데이터를 요약하지만 분명히 OP는 데이터의 모양을 변경하고 레이블을 새 열로 추가하여 이것이 어떻게 이렇게 생겼는지 확인하십시오. – Psidom

1
## read data 
base <- c(2015, 1, 67, 1, 10, 
      2015, 1, 65, 1, 11, 
      2015, 1, 69, 1, 15, 
      2015, 2, 65, 2, 20, 
      2015, 2, 67, 2, 25, 
      2015, 2, 67, 3, 15, 
      2015, 2, 69, 3, 12) 
base <- data.frame(matrix(base, 7, byrow = TRUE)) 
names(base) <- c('Year', 'Month', 'Product', 'Supermarket', 'Price') 

제작 몇 가지 기능이 변경되었습니다. I는 입력 (X)과 일치하는 객체를 변경하고, 세 번째 요소를 지정된 행에 대한

## create function 
prueba <- function(x) ifelse(x[3] == 65, 1, 0) 

1과 적용() 함수를 사용하여, 각각의 행에이 기능을 적용 ((관심 컬럼은 컬럼 3 이후)) apply(x, 1, function).

base$new_var <- apply(base, 1, prueba) 
base 
## Year Month Product Supermarket Price new_var 
## 1 2015  1  67   1 10  0 
## 2 2015  1  65   1 11  1 
## 3 2015  1  69   1 15  0 
## 4 2015  2  65   2 20  1 
## 5 2015  2  67   2 25  0 
## 6 2015  2  67   3 15  0 
## 7 2015  2  69   3 12  0 

또한 새 변수를 만들고 관련 행에 조건부로 '1'을 입력 할 수 있습니다.

base$new_var <- 0 
base$new_var[base$Product == 65] <- 1 
base 
## Year Month Product Supermarket Price new_var 
## 1 2015  1  67   1 10  0 
## 2 2015  1  65   1 11  1 
## 3 2015  1  69   1 15  0 
## 4 2015  2  65   2 20  1 
## 5 2015  2  67   2 25  0 
## 6 2015  2  67   3 15  0 
## 7 2015  2  69   3 12  0 
+0

답변과 새로운 코드에 감사드립니다. 정확하게 내가 뭘 찾고 있었는지 (이전 글 참조), 또한 유용합니다. 최고 –

관련 문제