2016-03-18 6 views
0

私はdplyrへの新加入者で、次の質問があります。 Myはdata.frameの1つの列をグループ変数として扱います。一部の行がグループに属していません。グルーピング列はNAです。dplyr mutate():グループがNAの場合は値を無視します

dplyr関数mutateを使用してdata.frameにいくつかの列を追加する必要があります。私はdplyrグループ化列がNAに等しいすべての行を無視することをお勧めします。私は例を挙げて説明しましょう:

library(dplyr) 

set.seed(2) 

# Setting up some dummy data 
df <- data.frame(
    Group = factor(c(rep("A",3),rep(NA,3),rep("B",5),rep(NA,2))), 
    Value = abs(as.integer(rnorm(13)*10)) 
) 

# Using mutate to calculate differences between values within the rows of a group 
df <- df %>% 
    group_by(Group) %>% 
    mutate(Diff = Value-lead(Value)) 

df 
# Source: local data frame [13 x 3] 
# Groups: Group [3] 
# 
#  Group Value Diff 
# (fctr) (int) (int) 
# 1  A  8  7 
# 2  A  1 -14 
# 3  A 15 NA 
# 4  NA 11 11 
# 5  NA  0 -1 
# 6  NA  1 -8 
# 7  B  7  5 
# 8  B  2 -17 
# 9  B 19 18 
# 10  B  1 -3 
# 11  B  4 NA 
# 12  NA  9  6 
# 13  NA  3 NA 

グループなしで行の間の差異を計算することも意味がありませんし、データを破壊しています。私はこれらの行を削除する必要があり、このようにそれを行っています

df$Diff[is.na(df$Group)] <- NA 

%>%使用してdplyrチェーンに上記のコマンドを含める方法はありますか?

df <- df %>% 
    group_by(Group) %>% 
    mutate(Diff = Value-lead(Value)) %>% 
    filter(!is.na(Group)) 

ただし、グループのない行はすべて一緒に削除されません。それとも、さらにいいのですが、dplyrをグループなしで無視する方法はありますか?

望ましい結果があるでしょう:

# Source: local data frame [13 x 3] 
# Groups: Group [3] 
# 
#  Group Value Diff 
# (fctr) (int) (int) 
# 1  A  8  7 
# 2  A  1 -14 
# 3  A 15 NA 
# 4  NA 11 NA 
# 5  NA  0 NA 
# 6  NA  1 NA 
# 7  B  7  5 
# 8  B  2 -17 
# 9  B 19 18 
# 10  B  1 -3 
# 11  B  4 NA 
# 12  NA  9 NA 
# 13  NA  3 NA 

答えて

4

は、単にあなたが作成しようとしている変数のiflelse条件を使用します。

library(dplyr) 
set.seed(2) 

df = data.frame(
    Group = factor(c(rep("A",3), rep(NA,3), rep("B",5), rep(NA,2))), 
    Value = abs(as.integer(rnorm(13)*10)) 
) %>% 
    group_by(Group) %>% 
    mutate(Diff = ifelse(is.na(Group), as.integer(NA), Value-lead(Value))) 
+0

通常の使用量はFYI、 'NA_integer_'組み込み定数です。 – Frank

+0

@Frank全く同じ問題を解決しました。「同一(as.integer(NA)、NA_integer_)」と私は「普通」についてはあまりよく分かりません。 – tchakravarty

+0

十分に公正です。 「いつも」とは、私が今までに見た唯一の方法を意味しています。 – Frank

関連する問題