2017-05-07 10 views
3

Rで複数の変数を同時にコード化したいと思います。変数はより大きなデータフレーム内にあります。複数の変数をRでコーディングする

z <- data.frame (A = c(1,2,300,444,555), 
       B = c(555,444,300,2,1), 
       C = c(1,2,300,444,555), 
       D = c(1,2,300,444,555)) 

私は何をしたいのは、私はおそらくでこれを行うことができると思った300 444 555

5と4のように、そして、3と等しいすべての値recodeのである:ここではいくつかの例のデータがありますリスト。ここに私が試したものです:

example_list = list(c("A", "B", "C", "D")) 

example_list <- apply(z[,example_list], 1, function(x) ifelse(any(x==555, na.rm=F), 0.5, 
                   ifelse(any(x==444), 0.25), 
                   ifelse(any(x==300), 3, example_list))) 

私はこのエラーを取得する:

Error during wrapup: invalid subscript type 'list' 

次に "lapply" を使ってみましたし、私はこのエラーを得た:

Error during wrapup: '1' is not a function, character or symbol 

はその後も私はしませんよこれがこれを行う最善の方法だと確信しています...私は、複数の変数に対してこの行を行単位で行うのを避けたいと思います。私がRに慣れていて、私が間違っていることを完全には理解していないので、どんな提案もすばらしいでしょう。

私はSO:Questionに関する同様の質問を見つけましたが、私の特定の問題にそれをどのように適用するかはわかりません。

答えて

1

これは少し不格好と思われるが、それは動作します:

mutate_cols <- c('A', 'B') 

z[, mutate_cols] <- as.data.frame(lapply(z[, mutate_cols], function(x) ifelse(x == 300, 3, 
                       ifelse(x == 444, 4, 
                        ifelse(x== 555, 5, x))))) 
+0

これは完全に働きました!ありがとうございました! – user7777508

0
z = data.frame (A = c(1,2,300,444,555), 
       B = c(555,444,300,2,1), 
       C = c(1,2,300,444,555), 
       D = c(1,2,300,444,555)) 



library(expss) 

to_recode = c("A", "B", "C", "D") 
recode(z[, to_recode]) = c(300 ~ 3, 444 ~ 4, 555 ~ 5) 
+0

あなたの答えはグレゴリーありがとうございます。私はこれがうまくいくと思いますが、私はexpssライブラリを持っていないようです... – user7777508

0

これは動作するはずです。 case_whenを使用して

library(plyr) 
new.z<- apply(z, 1, function(x) mapvalues(x, from = c(300, 444, 555), to = c(3, 4, 5))) 
1

library(dplyr) 
z %>% mutate_all(
    function(x) case_when(
     x == 300 ~ 3, 
     x == 444 ~ 4, 
     x == 555 ~ 5, 
     TRUE ~ x 
    ) 
) 

    A B C D 
1 1 5 1 1 
2 2 4 2 2 
3 3 3 3 3 
4 4 2 4 4 
5 5 1 5 5 
1

はここできれいに拡張し、非常に高速である必要があり、ベースRの試みです:

# set find and replace vectors 
f <- c(300,444,555) 
r <- c(3, 4, 5) 
# replace! 
m <- lapply(z, function(x) r[match(x,f)]) 
z[] <- Map(function(z,m) replace(m,is.na(m),z[is.na(m)]), z, m) 

# A B C D 
#1 1 5 1 1 
#2 2 4 2 2 
#3 3 3 3 3 
#4 4 2 4 4 
#5 5 1 5 5 
関連する問題