2016-10-31 12 views
1

私の全体的な目標は、別の変数の値を条件にした特定の文字列を持つ複数の変数の1つから新しい変数に値を割り当てることです。より具体的には、R:別の列で条件付きの値を置き換えて変数名を一致させる

データフレームに複数の列を追加しようとしています(たとえば、 'foo'など)、データフレームに既に存在する2つの列のうちの1つの値をとります。 2つの接尾辞(例えば 'foo.2009'と 'foo.2014')のうちの1つを別の列(例えば '年')の値で条件付きで終了させます。データフレームには、この操作とは無関係の列も含まれており、これらは接尾辞の欠如によって識別されます(たとえば 'other_example'は '.2009'または'2014 'で終わらない)。新しい名前のベクトルを作成した列。以下の例のデータでは、foofoo.2014の値を割り当てたい場合は、year >=2014とし、foo.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) 

、私はyear < 2014場合、私はyear >= 2014場合とbar == bar.2009bar == bar.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 
関連する問題