2015-10-21 69 views
1

我已經通過SO完成了大量的搜索,並且沒有找到或可能沒有理解以下問題的解決方案。我有以下示例數據框:對大量列的分類變量進行計數

df <- data.frame(Day = c('Day 1', 'Day 2', 'Day 3', 'Day 1', 'Day 2', 'Day 3'), 
    WBC.esc = c('Yes', 'Yes', 'Yes', 'No', 'No', 'No'), 
    WBC.deesc = c('No', 'No', 'No', 'No', 'Yes', 'Yes'), 
    WBC.cdm = c('Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes'), 
    Hgb.esc = c('Yes', 'No', 'Yes', 'No', 'Yes', 'No'), 
    Hgb.deesc = c('No', 'Yes', 'No', 'No', 'No', 'Yes'), 
    Hgb.cdm = c('No', 'No', 'No', 'No', 'No', 'No'), 
    Plt.esc = c('No', 'No', 'Yes', 'No', 'No', 'No'), 
    Plt.deesc = c('Yes', 'Yes', 'No', 'No', 'Yes', 'Yes'), 
    Plt.cdm = c('Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes')) 

# Day WBC.esc WBC.deesc WBC.cdm Hgb.esc Hgb.deesc Hgb.cdm Plt.esc Plt.deesc Plt.cdm 
# 1 Day 1  Yes  No  Yes  Yes  No  No  No  Yes  Yes 
# 2 Day 2  Yes  No  Yes  No  Yes  No  No  Yes  Yes 
# 3 Day 3  Yes  No  Yes  Yes  No  No  Yes  No  Yes 
# 4 Day 1  No  No  Yes  No  No  No  No  No  Yes 
# 5 Day 2  No  Yes  Yes  Yes  No  No  No  Yes  Yes 
# 6 Day 3  No  Yes  Yes  No  Yes  No  No  Yes  Yes 

天數表示患者在醫院中的天數。其他列名稱是指訂單類型。我想回答在WBC/Hgb/Plt.esc或WBC/Hgb/Plt.deesc類別中是否有命令(「是」)的問題。在大數據集中,在* .esc之前還有其他前綴,例如HeartRate.esc,BP.esc,因此只需在.esc後綴上搜索就行不通。我知道如何通過指定每個列名稱來低效地執行此操作。使用下面的代碼:

sum(df$Day=="Day 1" & (df$WBC.esc=="Yes" | df$WBC.deesc=="Yes" | df$Hgb.esc=="Yes" | df$Hgb.deesc=="Yes" | df$Plt.esc=="Yes" | df$Plt.deesc=="Yes")) 

# [1] 1 

這給出了1

我已經通過引用它們的數量從而節省了我使用的全列名的列正確答案(例如:dt[,2]代替dt$WBC.esc),但即使在我的實際數據集中有時會有40-50列可供參考,但這似乎過分乏味。在完整的數據集中,我希望能夠做類似下面的事情(使用excel術語,因爲這是我熟悉的,字母表是列名)。這個想法是需要一行,查看該行中所有指定的列以獲得「是」值,如果它發現它,則將其計爲1,或者如果未找到「是」,則將其計爲0

countif(B:E=="Yes" | H:Y=="Yes" | AE:AG=="Yes") 

我也試過這樣的:

sum(df$Day=="Day 1" & (dt[,2:3]=="Yes" | df[,5:6]=="Yes" | df[,8:9]=="Yes"),na.rm=TRUE) 

不作爲它的工作回到「2」表明它正指望每一個回答「是」。另外這個功能不運行,除非列數引用每個參差不齊如dt[,2:4] | dt[,8:9]在這種情況下,我得到:

"Error: binary operation on non-conformable arrays"

我已經通過了一些問題搜查,但在帖子中,我已經看到了列名單獨列出,未彙總。我怎樣才能執行引用多組相鄰列的操作,而不必單獨列出每個變量?

+0

我編輯我的職務,以反映在大量的數據可能有多種其他前綴.esc或.deesc所以只是在尋找這些條款本身並在其他列拉。 – Kiddecks

回答

0

你可以嘗試:

df$anyyes <- apply(df[-1], 1, function(x) any(x=="Yes")) 

導致以下數據幀:

> df 
    Day WBC.esc WBC.deesc WBC.cdm Hgb.esc Hgb.deesc Hgb.cdm Plt.esc Plt.deesc Plt.cdm anyyes 
1 Day 1  Yes  No  Yes  Yes  No  No  No  Yes  Yes TRUE 
2 Day 2  Yes  No  Yes  No  Yes  No  No  Yes  Yes TRUE 
3 Day 3  Yes  No  Yes  Yes  No  No  Yes  No  Yes TRUE 
4 Day 1  No  No  Yes  No  No  No  No  No  Yes TRUE 
5 Day 2  No  Yes  Yes  Yes  No  No  No  Yes  Yes TRUE 
6 Day 3  No  Yes  Yes  No  Yes  No  No  Yes  Yes TRUE 

如果你想列的特定選擇,例如只有在.esc結束列,你可以這樣做:

df$esc.yes <- apply(df[grep("\\.esc", names(df))], 1, function(x) any(x=="Yes")) 

這給:

> df 
    Day WBC.esc WBC.deesc WBC.cdm Hgb.esc Hgb.deesc Hgb.cdm Plt.esc Plt.deesc Plt.cdm esc.yes 
1 Day 1  Yes  No  Yes  Yes  No  No  No  Yes  Yes TRUE 
2 Day 2  Yes  No  Yes  No  Yes  No  No  Yes  Yes TRUE 
3 Day 3  Yes  No  Yes  Yes  No  No  Yes  No  Yes TRUE 
4 Day 1  No  No  Yes  No  No  No  No  No  Yes FALSE 
5 Day 2  No  Yes  Yes  Yes  No  No  No  Yes  Yes TRUE 
6 Day 3  No  Yes  Yes  No  Yes  No  No  Yes  Yes FALSE 

如果你想排除cdm列,你可以使用:

df$no.cdm <- apply(df[-c(1,grep("cdm", names(df)))], 1, function(x) any(x=="Yes")) 

注意我加了-1,因爲第一列也被排除在外。

+0

我只想看看選擇列(WBC.esc,WBC.deesc,Hgb.esc,Hgb.deesc,Plt.esc,Plt.deesc),但不是其他人(WBC.cdm等)。看起來這個代碼會評估所有列。有沒有辦法修改來檢查數據框中的選擇列? – Kiddecks

+0

@Kiddecks查看更新。 HTH – Jaap

0

如果我們只需要檢查帶有後綴'esc/deesc'的列名,使用grep,'df'(df[i1])列的子集創建一個數字索引,通過與'Yes'比較來獲得邏輯矩陣( 'm1'),split'm1'的列的序列乘以'm1'的列名的前綴子集,得到rowSums,使用Reduce+獲得對應元素的總和。通過雙重否定轉換爲邏輯矢量,並獲得由'日'分組的TRUE值的sum以獲得預期輸出。

i1 <- grep('(esc|deesc)$', colnames(df)) 
m1 <- df[i1]=='Yes' 
tapply(!!Reduce(`+`,lapply(split(1:ncol(m1), 
    sub('\\..*', '', colnames(m1))), function(i) 
     rowSums(m1[,i]))), df$Day, FUN=sum) 
# Day 1 Day 2 Day 3 
# 1  2  2 
+0

這絕對適用於這個特定的樣本數據集。儘管我的大數據集有其他列,包括後綴esc和deesc(指的是其他實驗室測試和生命體徵結果),我不想在此計算中包括該列。也許我可以先切片數據集然後運行這個代碼? – Kiddecks

+0

@Kiddecks無論如何,我根據你的文章中的描述對它進行了編碼。 – akrun

+0

據我所知,我現在看到我的描述是如何被誤導的,現在已經修改了它,希望能夠更好地反映這個問題。謝謝你的幫助 – Kiddecks