ベクトルをサブセット化しようとする効率的な関数またはコードスニペットを希望し、サブセットに要素がない場合はNA
を返します。このサブセット動作はAの一部として使用する場合、大きくない、例えば、サブセットが空の場合はNAを返す関数
v1 = c(1, 1, NA)
コードunique(v1[!is.na(v1)])
戻る大きいつのエントリが、
v2 = c(NA, NA, NA)
のコードunique(v2[!is.na(v2)])
戻るためlogical(0)
dplyr
鎖はsummarise_each
またはsummarise
を含有する。 logical(0)
の代わりにNA
を返すよう、2番目の操作をしたいと思います。
この背景の背景には、spread
複数のコマンドを使用してthis questionを解決しようとしていることがあります。我々は(別のカラム名とはいえ)所望の出力を達成することができ、複数のスプレッドを使用して、今すぐ
set.seed(10)
tmp_dat <- data_frame(
Person = rep(c("greg", "sally", "sue"), each=2),
Time = rep(c("Pre", "Post"), 3),
Score1 = round(rnorm(6, mean = 80, sd=4), 0),
Score2 = round(jitter(Score1, 15), 0),
Score3 = 5 + (Score1 + Score2)/2
)
> tmp_dat
Source: local data frame [6 x 5]
Person Time Score1 Score2 Score3
<chr> <chr> <dbl> <dbl> <dbl>
1 greg Pre 80 78 84.0
2 greg Post 79 80 84.5
3 sally Pre 75 74 79.5
4 sally Post 78 78 83.0
5 sue Pre 81 78 84.5
6 sue Post 82 81 86.5
:例のデータは、以前の質問から取られすぎがある場合、今
tmp_dat %>%
mutate(Time_2 = Time,
Time_3 = Time) %>%
spread(Time, Score1, sep = '.') %>%
spread(Time_2, Score2, sep = '.') %>%
spread(Time_3, Score3, sep = '.') %>%
group_by(Person) %>%
summarise_each(funs(((function(x)x[!is.na(x)])(.))))
を、問題が発生します多くのNAさん:
# Replace last two entries in the last row with NA's
tmp_dat$Score2[6] <- NA
tmp_dat$Score3[6] <- NA
今すぐsummarise_each
でコードスニペットを実行すると、エラーが発生します。
Error in eval(substitute(expr), envir, enclos) : expecting a single value
あなたの行が常にただ1つの値を返すことを知っているならば、最後に '[1]'を追加してください: 'unique(v2 [!is.na(v2)])[1]'。それ以外の場合は、独自の関数を定義するだけです。 'uniqueNotNA <-function(x){ind < - !is.na(x); if(sum(ind)== 0)NA else unique(x [ind])}' – nicola
ありがとうございます。これは効率的ですか?私は最後に[1]が好きです – Alex