2016-10-14 5 views
0

私は2つの変数を持つdata.frameを持っています。私はそれらをvar1でグループ化し、var2のすべてのxをそのグループの一意の異なる値に置き換える必要があります。例えばグループ化された変数に単一の値を代入する、R

var1 var2 
1  1 a 
2  2 a 
3  2 x 
4  3 b 
5  4 c 
6  5 a 
7  6 c 
8  6 x 
9  7 c 
10 8 x 
11 8 b 
12 8 b 
13 9 a 

結果は次のようになります。

var1 var2 
1  1 a 
2  2 a 
3  2 a <- 
4  3 b 
5  4 c 
6  5 a 
7  6 c 
8  6 c <- 
9  7 c 
10 8 b <- 
11 8 b 
12 8 b 
13 9 a 

私はこの例を解決するために管理しました:

dat <- data.frame(var1=c(1,2,2,3,4,5,6,6,7,8,8,8,9), var2=c("a","a","x","b","c","a","a","x","c","x","b","b","a")) 

dat %>% group_by(var1) %>% mutate(
    var2 = as.character(var2), 
    var2 = ifelse(var2 == 'x',var2[order(var2)][1],var2)) 

しかし、これはので、私の実際のデータでは動作しません。注文の:

私は別のアプローチが必要ですが、私は "not x"を明示的にチェックするようなものを考えていますが、解決策には至りませんでした。

お手数です!

+0

と? var1 = c(10,10,10)と同様です。 var2 = c( "a"、 "b"、 "x")。 xがグループ内の唯一の値であればどうなるでしょうか? –

答えて

2

data.tableを使用できます。 'data1'を 'var1'でグループ化した 'data.frame'を 'data.table'(setDT(df1))に変換し、 'x2'ではない 'var2'を取得し、最初の観測を選択して 'var2'に割り当てます(:=) 。あなたは、同じグループ内の2以上のユニークな非xの値を持っている場合はどう

library(data.table) 
setDT(df1)[, var2 := var2[var2!='x'][1], var1] 

それともdplyr

library(dplyr) 
df1 %>% 
    group_by(var1) %>% 
    mutate(var2 = var2[var2!="x"][1]) 
# var1 var2 
# <int> <chr> 
#1  1  a 
#2  2  a 
#3  2  a 
#4  3  b 
#5  4  c 
#6  5  a 
#7  6  c 
#8  6  c 
#9  7  c 
#10  8  b 
#11  8  b 
#12  8  b 
#13  9  a 
+1

作品、ありがとうございます! – Sebastian

関連する問題