2015-07-24 9 views
7

I mają następujące ramki danych w R:wypełnienia „nd jest w ramce danych z informacji zawartych w jednym z rzędów o identyfikatorze pacjenta przy użyciu R

ID Information 
1 Yes 
1 NA 
1 NA 
1 Yes 
2 No 
2 NA 
2 NA 
3 NA 
3 NA 
3 Maybe 
3 NA 

muszę wypełniać wierszy zawierających NA jest z jakakolwiek informacja jest zawarta w jednym z wierszy odpowiadających temu ID. chciałbym mieć to:

ID Information 
1 Yes 
1 Yes 
1 Yes 
1 Yes 
2 No 
2 No 
2 No 
3 Maybe 
3 Maybe 
3 Maybe 
3 Maybe 

O ile mi wiadomo, informacje (tj Tak/Nie/Być może) nie jest sprzeczne obrębie ID, ale mogą to być powtórzone (Przepraszam za brzydkie Format-. Jestem nowicjuszem i nie mogę zamieszczać zdjęć).

Dziękujemy!

Odpowiedz

5

Jedną opcją jest użycie data.table. Konwertujemy dane "data.frame" na "data.table" (setDT(df1)), pogrupowane według "ID", przypisujemy (:=) "Informacje" jako unique non-NA element.

library(data.table)#v1.9.5+ 
setDT(df1)[, Information:=unique(Information[!is.na(Information)]), by = ID] 
df1 
#  ID Information 
# 1: 1   Yes 
# 2: 1   Yes 
# 3: 1   Yes 
# 4: 1   Yes 
# 5: 2   No 
# 6: 2   No 
# 7: 2   No 
# 8: 3  Maybe 
# 9: 3  Maybe 
# 10: 3  Maybe 
# 11: 3  Maybe 

Lub możemy dołączyć do zestawu danych z unikalnymi wierszami zestawu danych po usunięciu wierszy "NA". Tutaj używam wersji data.table

setDT(unique(na.omit(df1)))[df1['ID'], on='ID'] 

devel Albo używamy dplyr, pogrupowanych według „ID”, my arrange „informacje” tak, że „NA” będzie ostatnim, stworzyć „Informacja” jako pierwsza wartość "Informacji".

library(dplyr) 
df1 %>% 
    group_by(ID) %>% 
    arrange(Information) %>% 
    mutate(Information= first(Information)) 
+1

Inną opcją byłoby użycie 'na.locf' z' zoo' jak to 'setDT (d) [, Information: = na.locf (Information), by = ID]' –

+0

@VereereraGadekar Wygląda jak "na. locf' pracował na przykład. Więc prawdopodobnie się myliłem. – akrun

+1

@VereereraGadekar Myślę, że potrzebujesz 'transform' lub' mutate', ponieważ 'summary 'podsumowuje wynik do pojedynczego wiersza. – akrun

3

Oto opcja korzystania na.locf z ddply

library(zoo) 
library(plyr) 

ddply(d, .(ID), mutate, Information = na.locf(Information)) 

# ID Information 
#1 1   Yes 
#2 1   Yes 
#3 1   Yes 
#4 1   Yes 
#5 2   No 
#6 2   No 
#7 2   No 
#8 3  Maybe 
#9 3  Maybe 
#10 3  Maybe 
#11 3  Maybe 
+1

Dziękuję bardzo! – Bogs

2

Albo w podstawowej R:

uniqueCombns <- unique(dat[complete.cases(dat),]) 
merge(dat["ID"], uniqueCombns, by="ID", all.x=T) 

gdzie DAT to dataframe

+0

Dziękuję bardzo! – Bogs

1

Od DF$information jest ważny czynnik” "i nie ma żadnych konfliktów, możesz też zrobić (chyba że jestem ign coś oring):

levels(DF$Information)[approxfun(DF$ID, DF$Information, method = "constant")(DF$ID)] 
# [1] "Yes" "Yes" "Yes" "Yes" "No" "No" "No" "Maybe" "Maybe" "Maybe" "Maybe" 
1

Zakładając istnieje dokładnie jeden non-NA w każdej grupie możemy po prostu pominąć NAS i przypisać wartość pozostałą do wszystkich innych w ten sposób przez grupę. Stosowane są żadne pakiety:

transform(df, Information = ave(Information, ID, FUN = na.omit)) 

podając:

ID Information 
1 1   Yes 
2 1   Yes 
3 1   Yes 
4 1   Yes 
5 2   No 
6 2   No 
7 2   No 
8 3  Maybe 
9 3  Maybe 
10 3  Maybe 
11 3  Maybe 

Jeśli nie może być więcej niż jeden non-NA w każdej grupie, ale wszystkie są takie same, a następnie zastąpić na.omit z function(x) na.omit(x)[1].

+0

Dziękuję za odpowiedź, ale wartości NA nie zawsze były pierwsze w grupie (można to zobaczyć przy ID 3). Mimo wszystko dziekuję! – Bogs

+0

OK. W takim przypadku zmieniłem odpowiedź. –

+0

Dziękuję bardzo! – Bogs

Powiązane problemy