2017-06-29 3 views
0

私は3列(ID、日付、日)のデータフレームを持っています。列Xは私が得たいものです。 NAがある場合は、前月から現在の月の日数を合計したいと思います。それはdplyrで行うことが可能ですか?私は、forループでそれを実行しようとしましたが、それは私がここより グループ内で合計します。

5M行より
ID  date  days X 
    A  2014-01-31  NA NA 
    A  2014-02-28  NA NA 
    A  2014-03-31  4 4 
    A  2014-04-30  NA 34 
    A  2014-05-31  NA 65 
    A  2014-06-30  NA 95 
    A  2014-07-31  NA 126 
    B  2014-01-31  NA NA 
    B  2014-02-28  11 11 
    B  2014-03-31  6 6 
    B  2014-04-30  NA 36 
    B  2014-05-31  6 6 
    B  2014-06-30  NA 36 
    C  2015-01-31  NA NA 
    C  2015-02-28  NA NA 
+0

を使用しての試みで申し訳ありません...明らかではないが、まさに達成したい。たとえば、あなたのX列にNAがないときに達成したいのは何ですか? – Umberto

+0

列 'X'は指定されていません。それは私が列 '日'に実行された計算に基づいて取得したい結果です – Koles

+0

あなたにコードが表示されますか?私には分かりません – akrun

答えて

2

を持っているように時間がかかりすぎるtidyverse

library(tidyverse) 

df %>% 
mutate(date = as.Date(date, format = '%Y-%m-%d')) %>% 
group_by(ID) %>% 
mutate(new = cumsum(!is.na(days))+1) %>% 
group_by(ID, new) %>% 
mutate(new1 = cumsum(ifelse(is.na(days), as.numeric(diff.difftime(date)), days)), 
     new1 = replace(new1, new == 1, NA)) %>% 
ungroup() %>% 
select(-new) 

# A tibble: 15 x 5 
#  ID  date days  X new1 
# <fctr>  <date> <int> <int> <dbl> 
# 1  A 2014-01-31 NA NA NA 
# 2  A 2014-02-28 NA NA NA 
# 3  A 2014-03-31  4  4  4 
# 4  A 2014-04-30 NA 34 35 
# 5  A 2014-05-31 NA 65 65 
# 6  A 2014-06-30 NA 95 96 
# 7  A 2014-07-31 NA 126 126 
# 8  B 2014-01-31 NA NA NA 
# 9  B 2014-02-28 11 11 11 
#10  B 2014-03-31  6  6  6 
#11  B 2014-04-30 NA 36 36 
#12  B 2014-05-31  6  6  6 
#13  B 2014-06-30 NA 36 36 
#14  C 2015-01-31 NA NA NA 
#15  C 2015-02-28 NA NA NA 
+1

ありがとうございました。 1つのIDの最後にNAがあり、別のIDの始めにNAがあるときは1つの問題があります。結果は間違っています – Koles

+0

@Koles、あなたの質問にそれを編集します。そこにある可能性のあるコーナーケースを含めて、私たちの回答に余裕がないようにしてください – Sotos

+1

私は自分のクエストを編集しました。私は2つのNAとマシンに問題のないケースを含めました。私はそれがすべてだと思う。 – Koles

関連する問題