2017-04-04 76 views
0

我試圖轉換一段時間內每個人都有多個觀察值的數據集。例如,在此期間,人1可能肥胖而不肥胖(只是超重)。下面是從一個人1個例子:用R或組中的ID替換特定列的最大值

ID  Obese  Overweight 
1  NA   NA 
1  NA   NA 
1  0   1 
1  1   0 
1  0   0 
2  NA   0 
2  0   1 
2  0   NA 

我需要爲「1」,如果1出現在都在此列,跨列指定數量(有700+替換每列中的值;例如c(5:749))BY「ID」。理想情況下,輸出將如下所示:

ID  Obese  Overweight 
1  1   1 
1  1   1 
1  1   1 
1  1   1 
1  1   1 
2  0   1 
2  0   1 
2  0   1 

首先我將所有的NAs都更改爲0;然後,我認爲我可以沿每列取最大值並替換(通過ID),但無法找到有關如何通過組(「ID」)和給定的一組列(即c(5:749) )。此外,我不想創建新列,而只是替換數據框中已有列中的值。

我得到它可以對單變量的工作,但不能轉化爲循環這要經過一組變量...

​​

而且我覺得一個循環的時間太長給出數據大小。還有其他建議嗎?提前致謝。下面是一個例子數據集:

dat <- as.data.frame(matrix(NA,18)) 
dat$id <- as.character(c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)) 
dat$ob1 <- as.character(c(NA,NA,0,1,0,NA,0,1,0,0,0,0,0,0,0,0,0,0)) 
dat$ob2 <- as.character(c(NA,NA,1,0,0,NA,0,0,1,0,0,0,0,1,0,0,0,0)) 
dat <- dat[,-1] 

至於鏈接使用「lapply」分頁,它似乎並沒有在所有的值都是NA(或0)爲某一個人的情況下工作。在這種情況下,它似乎用其他列中的值「填充」/插值(從未出現在原始數據集的列中);當一個二進制變量被推斷/替換爲一個連續值時,這顯然被發現。任何想法爲什麼這可能會發生?

+0

在鏈接的問題,你可以看到在評論中更多的選擇。 – Frank

+0

感謝您鏈接此頁面;它似乎是我正在尋找,但我仍然遇到一個錯誤。例如,在給定個體的所有值都是NA的列中,它似乎用從其他列開始的值「填充」/插值(從未出現在原始數據集的列中);當一個二進制變量被推斷/替換爲一個連續值時,這顯然被發現。任何想法爲什麼這可能會發生? – mgianfra

+0

好的,也許你可以發佈一個例子來說明這一點?我不太瞭解所描述的情況。 – Frank

回答

1

我認爲tapply對這種情況很有幫助。 您可以通過

with(dat, tapply(ob1, id, max)) 

找到最多每個ID我的解決辦法是:

dat$ob1 <- as.numeric(dat$ob1) 
dat$ob2 <- as.numeric(dat$ob2) 
dat[is.na(dat)] <- 0 

dat$ob1 <- with(dat,tapply(ob1,id,max)[id]) 
dat$ob2 <- with(dat,tapply(ob2,id,max)[id]) 

dat 
    id ob1 ob2 
1 1 1 1 
2 1 1 1 
3 1 1 1 
4 1 1 1 
5 1 1 1 
6 1 1 1 
7 2 1 1 
8 2 1 1 
9 2 1 1 
10 2 1 1 
11 2 1 1 
12 2 1 1 
13 3 0 1 
14 3 0 1 
15 3 0 1 
16 3 0 1 
17 3 0 1 
18 3 0 1 
+1

謝謝,但有沒有辦法做到這一點,而不必爲每個變量指定?例如,我有數百個列,並且不能爲每個列寫出tapply命令。我將如何編寫這段代碼來執行命令,比如第5欄:749? – mgianfra