2016-10-14 33 views
0

我有一個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)) 

但是,這並不對我的真實數據,因爲工作的訂購:(

我需要另外一種方法,我想像一下明確地檢查「不是x」,但我沒有找到解決方案。

任何幫助欣賞!

+0

如果你有同一組內的兩個或多個唯一的非x值?像var1 = c(10,10,10); VAR2 = C(「A」,」 B」,」 X」)。如果x是組中唯一的價值呢? –

回答

2

我們可以使用data.table。將'data.frame'轉換爲'data.table'(setDT(df1)),按'var1'分組,我們得到不是'x'的'var2',選擇第一個觀察值並將其分配(:=)到'var2' 。

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