2016-10-31 3 views
1

내 목표는 다른 변수의 값에 조건부로 일치하는 특정 문자열을 가진 여러 변수 중 하나의 새 변수에 값을 할당하는 것입니다. 더 구체적으로 :R : 다른 열에서 조건부로 값 바꾸기 및 변수 이름 일치

주어진 새 열 (예 : 'foo') 각각은 데이터 프레임에 이미있는 두 개의 열 중 하나의 값을 사용하고 이름이로 시작하는 데이터 프레임에 많은 열을 추가하려고합니다. 두 번째 접미사 (예 : 'foo.2009'및 'foo.2014') 중 하나를 사용하여 다른 열 (예 : '연도')의 값을 조건부로 사용하여 끝납니다. 데이터 프레임에도이 연산과 관련이없는 열이 포함되어 있으며 이러한 접미어가 부족하여 식별됩니다 (예 : 'other_example'이 '.2009'또는 '2014 '로 끝나지 않음). 그리고 새 이름의 벡터를 만들었습니다 열. 아래 예제 데이터에서 foofoo.2014의 값을 할당하려면 year >=2014foo.2009 인 경우 year < 2014으로 지정하고 싶습니다. 내 실제 데이터에서

# Original data frame 
df <- data.frame(foo.2009 = seq(1,3), 
        foo.2014 = seq(5,7), 
        foo = NA, 
        bar = NA, 
        other_example = seq(20,22), 
        year = c(2014,2009,2014)) 
print(df) 

# The vector of variable names ending in '.####` 
names <- c("foo") 

# Target data frame 
df$foo <- c(5,2,7) 
print(df) 

, 나는 내가 bar == bar.2014year >= 2014 경우 bar == bar.2009year < 2014 경우 원하는 foo (예를 들어 bar)과 유사한 많은 변수가있다.

# The vector of variable names ending in `.####` 
names <- c("foo","bar") 

# Original data frame 
df <- data.frame(foo.2009 = seq(1,3), 
        foo.2014 = seq(5,7), 
        bar.2009 = seq(8,10), 
        bar.2014 = rep(5,3), 
        foo = NA, 
        bar = NA, 
        other_example = seq(20,22), 
        year = c(2014,2009,2014)) 
df 

# Target data frame 
df$foo <- c(5,2,7) 
df$bar <- c(5,9,5) 
df 
: 그래서 저는 내가 값을 대체 할 변수의 임의의 큰 수에 대한 변수 이름의 벡터 (예를 들어 names를) 내가 할 수있는 루프를 통해 솔루션을 개발 (또는에서 벡터화 작업을 사용하는) 노력하고 있어요

저는 루프에서 변수 이름을 구성하는 여러 문자열을 평가하거나 벡터화 된 접근법을 사용해야 할 필요성 때문에 특히 문제가 있습니다. 다음은 dplyr :: mutate()를 사용하여 변수를 추가 한 다음 값을 할당하는 시도입니다. 아래는 위의 데이터와 동일하지만 재 코딩 할 추가 변수의 예입니다.

library(dplyr) 

for (i in names){ 
    var09 <- paste0(i, ".2009") 
    var14 <- paste0(i, ".2014") 
    dplyr::mutate_(df, 
       i = ifelse(df$year < 2010, 
          paste0("df$",i, ".2009"), 
          paste0("df$",i, ".2014")))} 
+1

보관하지 마십시오 열 이름의 변수; 대신에 긴 형태로 변형하면 이러한 회선을 피할 수 있습니다. – alistaire

+1

불행히도이 형식의 데이터를 제공해야하므로 긴 형식의 데이터를 제공 할 수 없습니다. – QuestionAnswer

+0

이 솔루션이 도움이 될 수 있습니다 http://stackoverflow.com/a/30271447/3893729 – MFR

답변

1

우리가 할 수 base R의 순서를 통해 루프

nm1 <- c("foo\\.\\d+", "bar\\.\\d+") 
nm2 <- c("foo", "bar") 
for(j in seq_along(nm1)){ 
    sub1 <- df[grep(nm1[j], names(df))] 
    df[[nm2[j]]] <- ifelse(df$year < 2010, sub1[[1]], sub1[[2]]) 
} 

df 
# foo.2009 foo.2014 bar.2009 bar.2014 foo bar other_example year 
#1  1  5  8  5 5 5   20 2014 
#2  2  6  9  5 2 9   21 2009 
#3  3  7  10  5 7 5   22 2014