2017-05-23 2 views
2

colとグループごとに発生するすべての等しい/同じ値(ユニーク== 1)が必要です。NA:
グループごとおよび列ごとに少なくとも2つの異なる私はそれらをすべて保ちたいと思っています。すべての同じ値を設定するNA、グループワイズおよびカラムワイズ

説明が難しい。いくつかのサンプルデータがあります:

担当者例:所望の出力がある

> ds 
    group mpg cyl disp hp stringis 
1  1 1337.0 4 108 93  a 
2  1 22.8 4 1337 93  a 
3  1 22.8 4 1337 93  a 
4  2 21.0 6 160 110  b 
5  2 21.0 1337 160 110  c 
6  2 21.0 6 160 110  d 
7  3 21.0 6 160 110  e 
8  3 1337.0 6 160 110  e 
9  3 21.0 6 160 110  f 
> 

> ds 
    group mpg cyl disp hp stringis 
1  1 1337.0 NA 108 NA  NA 
2  1 22.8 NA 1337 NA  NA 
3  1 22.8 NA 1337 NA  NA 
4  2  NA 6 NA NA  b 
5  2  NA 1337 NA NA  c 
6  2  NA 6 NA NA  d 
7  3 21.0 NA NA NA  e 
8  3 1337.0 NA NA NA  e 
9  3 21.0 NA NA NA  f 
> 

私はtapply内sapplyでそれを行うために管理することができると思うが、私はそこにすべきだと思うように

ds <- data.frame() 
for (i in 1:3) { 
    for(ii in 1:3) { 
     ds <- rbind(mtcars[i,1:4],ds) 
    } 
} 
rownames(ds) <- NULL 
ds[1,1] <- 1337;ds[2:3,3] <- 1337;ds[5,2] <- 1337;ds[8,1] <- 1337; 
ds <- cbind(group=rep(1:3,each=3),ds,stringis=c("a","a","a","b","c","d","e","e","f")) 

に見えますより読みやすく、より速く解決することができます。

一般的な解決策を探しています。実際にはグループが常にトリプルなどのグループここ

答えて

6

をされてアレント1つのアイデア、

f1 <- function(x) replace(x, length(unique(x)) == 1, NA) 

library(dplyr) 

ds %>% 
group_by(group) %>% 
mutate_all(funs(f1)) 

#Source: local data frame [9 x 6] 
#Groups: group [3] 

# group mpg cyl disp hp stringis 
# <int> <dbl> <dbl> <dbl> <dbl> <fctr> 
#1  1 1337.0 NA 108 NA  NA 
#2  1 22.8 NA 1337 NA  NA 
#3  1 22.8 NA 1337 NA  NA 
#4  2  NA  6 NA NA  b 
#5  2  NA 1337 NA NA  c 
#6  2  NA  6 NA NA  d 
#7  3 21.0 NA NA NA  e 
#8  3 1337.0 NA NA NA  e 
#9  3 21.0 NA NA NA  f 

それとも

ds %>% 
group_by(group) %>% 
mutate_all(funs(replace(., length(unique(.)) == 1, NA))) 

data.table、その後、関数を定義したくない場合

library(data.table) 
setDT(ds)[, lapply(.SD, f1), by = group][] 

# group mpg cyl disp hp stringis 
#1:  1 1337.0 NA 108 NA  NA 
#2:  1 22.8 NA 1337 NA  NA 
#3:  1 22.8 NA 1337 NA  NA 
#4:  2  NA 6 NA NA  b 
#5:  2  NA 1337 NA NA  c 
#6:  2  NA 6 NA NA  d 
#7:  3 21.0 NA NA NA  e 
#8:  3 1337.0 NA NA NA  e 
#9:  3 21.0 NA NA NA  f 

基本R

ds[-1] <- lapply(ds[-1], function(i) with(ds, ave(i, group, FUN = f1))) 

ds 
# group mpg cyl disp hp stringis 
#1  1 1337.0 NA 108 NA  <NA> 
#2  1 22.8 NA 1337 NA  <NA> 
#3  1 22.8 NA 1337 NA  <NA> 
#4  2  NA 6 NA NA  b 
#5  2  NA 1337 NA NA  c 
#6  2  NA 6 NA NA  d 
#7  3 21.0 NA NA NA  e 
#8  3 1337.0 NA NA NA  e 
#9  3 21.0 NA NA NA  f 
+1

私は間違いなくデータテーブルについて学ぶ必要があります。本当の必要があります –

+0

@AndreElrico、yup。私もそうです:) – Sotos

+3

'n_distinct'を使用してdplyr構文にするか、' data.table'から 'uniqueN'を作成することができます – akrun

関連する問題