2017-06-14 22 views
0

我對多個應答者進行了多波調查,數據由userid標識。有數百個問題,data.table中的列。 Wave和useriddata.table的行。我想將每個userid的波浪摺疊或拼成一行。如果問題以多個波形/行使用,我想保留最近波形的迴應。例如,如果一個問題在第6行和第7行中對特定的userid有響應,我希望該相應的userid的彙總行具有來自第7行的響應。如果相應的userid的列最終具有全部NA,在最終輸出中獲得NA是沒有問題的。R:使用多個波形/重複行調查摺疊數據框

library(data.table) 
library(dplyr) 

樣本數據:

> dput(testc) 
structure(list(userid = c("QW3208", "QW3208", "QW3208", "QW3208", 
"QW3208", "QW3208", "QW3208", "QW3208", "QW3208", "QW3208", "QW3208", 
"QW3208", "QW3227", "QW3227", "QW3227", "QW3227", "QW3227", "QW3227", 
"QW3227", "QW3227", "QW3227", "QW3227", "QW3227", "QW3227"), 
wave_id = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L), .Label = c("Wave 1 ", "Wave 2 ", "Wave 3 ", "Wave 4 ", 
"Wave 5 ", "Wave 6 ", "Wave 7 ", "Wave 8 ", "Wave 9 ", "Wave 10 ", 
"Wave 11 ", "Wave 12 "), class = "factor"), blnc = c(1L, 
2L, NA, NA, 3L, NA, NA, NA, 4L, NA, NA, NA, 1L, 2L, NA, NA, 
2L, NA, NA, NA, 1L, NA, NA, NA), lines = c(NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, "2", NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, "2", NA), know = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1L)), .Names = c("userid", "wave_id", "blnc", "lines", 
"know"), class = c("data.table", "data.frame"), row.names = c(NA, 
-24L), .internal.selfref = <pointer: 0x0000000000350788>) 

預期輸出:

userid wave_id blnc lines know 
1: QW3208 Wave 12  4  2 1 
2: QW3227 Wave 12  1  2 1 

如果我使用下文中,它的工作原理的一列在時間:

> testc[!is.na(testc$blnc)] %>% group_by(userid) %>% arrange(desc(wave_id)) %>% slice(1) 
Source: local data table [2 x 5] 
Groups: userid 

    userid wave_id blnc lines know 
    (chr) (fctr) (int) (int) (int) 
1 QW3208 Wave 9  4 NA NA 
2 QW3227 Wave 9  1 NA NA 

我可以得到我想要的第一家公司的結果這裏有數據。我不知道如何在每個userid的所有列上重複示例代碼,並將它們都作爲data.table返回,而不需要太多清理。大多數列的值都是整數,但有些是因素或字符。

回答

0

以下內容將您的數據分割爲userid,然後使用lapply獲取每列中最新的而非NA的值。如果該列全部爲NA,則返回NA

testc %>% 
    split(testc$userid) %>% 
    lapply(function(group_by_id) { 
    lapply(group_by_id, function(each_column) { 
     each_column <- na.omit(each_column) 

     if(length(each_column) == 0) { 
     NA 
     } else { 
     each_column[length(each_column)] 
     } 

    }) 
    }) %>% 
    do.call(what = bind_rows, .) %>% 
    data.table() 
+0

工作。謝謝。在我發佈在這裏的示例數據中,我將'userid'從一個因子中更改爲字符變量,並且您的代碼不會與'userid'一起運行,作爲我在計算機上進行測試的更大示例的一個因子。照顧這一點,它哼了一聲。我試圖理解你的代碼,我不得不承認,我不能。我以爲'lapply()'不得不從列表開始,你使用的第一個似乎不是。而你從看似稀薄的空氣給我創造'each_column'。我不是在敲你,你幫助了我,我只是想明白。 – shea

+0

'lapply'很奇怪,別擔心。按照我們的方式對數據框架(data.table,在這種情況下)使用'split',創建一個按id分組的data.frames列表。我們可以在管道中寫入'lapply(。,a_function)',但我使用了縮寫形式。如果你在這樣的列表中使用'lapply',那麼你應用的函數將把每個數據幀作爲它的參數。這就是爲什麼我們需要嵌套一個'lapply',所以我們把每個data.frame的'每一列'作爲我們正在應用的函數的參數。 –