2016-04-25 11 views
3

たとえば、data.tableには3つの列があります。私は単一の列の条件に基づいて各行を変更したい。簡単に言えする方法はありdplyrで行全体に条件を適用する

a <- c(1,2,3,4,5) 
b <- c(2,4,6,7,8) 
c <- c(3,6,9,0,3) 

data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a), 
              b=ifelse(a==4,b*4,b), 
              c=ifelse(a==4,c*4,c)) 

:この例では、列の場合== 4は、その行のすべての列が、これは次のようになり、すべての変数で記述された4

を掛けています各列を書き込むことなく1行で条件を満たしていますか?

data.frame(a,b,c) %>% rowwise() %>% mutate(.=ifelse(a==4,.*4,.)) 
+2

なぜdplyrですか? 'df [df $ a == 4、] < - df [df $ a == 4、] * 4' – zx8754

+0

これは例より複雑です。これは、dplyrソリューションに比べて実際には遅いでしょうか? – Sebastian

+1

「複雑な」例を提供してください。 – zx8754

答えて

3

これはmutate_eachのために設計されたものですが、何らかの理由ですべてdplyrの解決策がセルに正解を与えていません210。

a <- c(1,2,3,4,5) 
b <- c(2,4,6,7,8) 
c <- c(3,6,9,0,3) 

A <- data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a), 
               b=ifelse(a==4,b*4,b), 
               c=ifelse(a==4,c*4,c)) 
B <- data.frame(a,b,c) %>% mutate(a=ifelse(a==4,a*4,a), 
            b=ifelse(a==4,b*4,b), 
            c=ifelse(a==4,c*4,c)) 

C <- data.frame(a,b,c) %>% 
    mutate_each(funs(ifelse(a == 4, . * 4, .))) 

D <- data.frame(a,b,c) %>% 
    rowwise() %>% 
    mutate_each(funs(ifelse(a == 4, . * 4, .))) 

E <- data.frame(a,b,c) 
E[E$a == 4, ] <- E[E$a == 4, ] * 4 

all.equal(A, B) 
#TRUE 
all.equal(A, C) 
#TRUE 
all.equal(A, D) 
#TRUE 
all.equal(A, E) 
#FALSE 

zx8754から基本コードは、私はかなり理由を理解していない4 によってのみaを掛けます他の人に、正しい答えを持つ唯一のものです。

バグ(?)の可能性があります。 file an issue on Githubにすることもできます。

+1

私が見ることができる限り、== 4の行のすべての列が4で乗算されるわけではありません。 –

+0

ええ、そうです。私はちょうどOPのロングバージョンと私の出力を一致させた。編集します.... – Axeman

-1

あなたがあなた自身の関数を作ることによってdplyrとzx8754のソリューションを組み合わせること:

multiply.if <- function(x){ 
    x[x$a == 4, ] <- x[x$a == 4, ] * 4 
    return(x) 
} 

data.frame(a,b,c) %>% multiply.if() 

問題はより複雑である場合、あなたは機能を一般化でき、すなわち:

私はこのようなものを想像します
multiply.if <- function(x, factor = 1){ 
    x[x$a == factor, ] <- x[x$a == factor, ] * factor 
    return(x) 
} 

data.frame(a,b,c) %>% multiply.if(4) 
+0

これはパイプを使用していますが、実際には 'dplyr'を使用していません。 – Axeman

+1

あなたはそうです、私はそこに銃を飛ばしました。私はここに新しいので、私は私の答えを削除するか、それを放置すべきかどうかわからないのですか? – Fridriksson

関連する問題