最初にいくつかのコンテキスト:私は健康関連のデータを含むデータセットを扱っています。治療前後の質問票スコアが含まれます。ただし、一部のクライアントは、さらに処理するためにデータ内に再表示されます。コードセクションにデータのモック例を示しました。
これは私が最もよく知っているパッケージであるため、dplyrで解決策を考え出そうとしましたが、私が望んでいたことを達成できませんでした。
#Example/mock data
ClientNumber<-c("4355", "2231", "8894", "9002", "4355", "2231", "8894", "9002", "4355", "2231")
Pre_Post<-c(1,1,1,1,2,2,2,2,1,1)
QuestionnaireScore<-c(62,76,88,56,22,30, 35,40,70,71)
df<-data.frame(ClientNumber, Pre_Post, QuestionnaireScore)
df$ClientNumber<-as.character(df$ClientNumber)
df$Pre_Post<-as.factor(df$Pre_Post)
View(df)
#tried solution
df2<-df%>%
group_by(ClientNumber)%>%
filter( Pre_Post==1|Pre_Post==2)
#this doesn't work, or needs more code to it
ご覧のとおり、最初の4つのクライアント番号には、治療前と治療後のスコアがあります。これはいい。ただし、クライアント番号4355と2231が最後に再び表示されます(再発して新しい治療を開始したと言えます)。これらの2人のクライアントは治療後のスコアを持っていません。
前後のスコアがあるクライアントのみを分析したいので、治療を完了したクライアントをフィルタリングする必要があります。また、データに再び表示された場合は、治療後のスコアがないクライアントは除外します。私が提供した例に関連して、最初の8つは分析に含め、最後の2つは治療後のスコアがないため除外したいと思います。
もう1つのオプションは、すべてに対して2つのグループを作成し、2ClientNumber
つの行があるグループのみを選択することです。
library(dplyr)
df %>%
arrange(ClientNumber) %>%
group_by(ClientNumber, group = cumsum(Pre_Post == 1)) %>%
filter(n() == 2) %>%
ungroup() %>%
select(-group)
# ClientNumber Pre_Post QuestionnaireScore
# <chr> <fct> <dbl>
#1 2231 1 76
#2 2231 2 30
#3 4355 1 62
#4 4355 2 22
#5 8894 1 88
#6 8894 2 35
#7 9002 1 56
#8 9002 2 40
同じことを使用してベースRに変換できます ave
new_df <- df[order(df$ClientNumber), ]
subset(new_df, ave(Pre_Post,ClientNumber,cumsum(Pre_Post == 1),FUN = length) == 2)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加