2016-08-23 52 views
3

我的數據針對每個制裁年的制裁。有5種類型的有針對性的制裁,但由於我有興趣全面瞭解制裁,而不是其特定類型,所以我想創建一個新的專欄,表示是否在特定年份實施全面的針對性制裁。從4個變量創建單列

df1 <- data.frame(Country = 'Angola', 
       Asset_freeze = c(1, 0), 
       Sectoral = c(1, 0), 
       Commodity = c(1, 0), 
       Diplomatic = c(1, 0), 
       Individual = c(1, 0), 
       Year = c('1993', '1994', '1995') 

    Country Asset_freeze Sectoral Commodity Diplomatic Individual Year 
    (chr)  (dbl) (dbl)  (dbl)  (dbl)  (dbl) (int) 
1 Angola    0  1   1   0   0 1993 
2 Angola    0  1   1   0   0 1994 
3 Angola    0  1   1   0   0 1995 

我想它看起來像如下:

 Country   Year Sanctions 
    (chr)    (int)  (dbl) 
1 Angola    1993  1 
2 Angola    1994  1 
3 Angola    1995  1 

如何我能得到這個?由於

+0

在哪種情況下'Sanctions'爲0? –

+1

您的輸入數據集代碼給了我錯誤 – akrun

+0

您能否更專注於編碼問題而不是您正在應用的特定問題來描述您的問題?我們不應該解釋你的意思是制裁。你的意思是每年的中間五列是否有非零條目? @akrun:我認爲這是最後一個缺失的支架。 – Bazz

回答

3

可以橫行總和(rowSums),涉及5種Sanctions,並檢查是否有任何制裁被強加的,然後轉換爲布爾值使用as.numeric

cbind(df1[c("Country", "Year")], Sanctions = as.numeric(rowSums(df1[, 2:6]) > 0)) 


# Country Year Sanctions 
#1 Angola 1993   1 
#2 Angola 1994   1 
#3 Angola 1995   1 
+1

已經工作了,謝謝! – MB92

2

您也可以使用到數字列的cbindapplyifelse組合:

cbind(df1[,c(1,7)], Sanctions=apply(df1[,2:6], 1, function(x) { 
    ifelse(any(x==1), 1, 0) 
})) 

Country Year Sanctions 
Angola 1993 1   
Angola 1994 1   
Angola 1995 1 

正如@Bazz建議,這可能已經縮短通過執行以下操作:

cbind(df1[,c(1,7)], Sanctions=as.numeric(apply(df1[,2:6], 1, any))) 

在這裏,列是按索引號而不是按名稱選擇的。但如果你想要的話,你可以很容易地通過名字來獲取列。

我希望這會有所幫助。

+1

你可以簡單地申請(df1 [,2:6],1,任何)'。輸出將是邏輯而不是整數。 – Bazz

+0

我試圖避免提供生成'warnings'的解決方案。此外,它只是更明確地顯示發生了什麼。但我會確保編輯答案。 – Abdou

2

您可以使用dplyr和結果的命令傳達你想要達到的目標:

library(dplyr) 
df1 %>% group_by(Country, Year) %>% 
     mutate(Sanctions = as.numeric(any(Asset_freeze, Sectoral, Commodity, Diplomatic, Individual))) %>% 
     select(Country, Year, Sanctions) 
## Country Year Sanctions 
## <fctr> <fctr>  <dbl> 
##1 Angola 1993   1 
##2 Angola 1994   1 
##3 Angola 1995   1 
2

我們可以使用pmax爲列2:6,它會自動拿起最大值

cbind(df1[c("Country", "Year")], Sanctions = do.call(pmax, df1[2:6])) 
# Country Year Sanctions 
#1 Angola 1993   1 
#2 Angola 1994   1 
#3 Angola 1995   1 
2

使用data.table

require(data.table) 

setDT(df1) 

NSanc <- 5L 

df1[, list(Sanctions = do.call(any, .SD)), 
    by = c("Country", "Year"), 
    .SDcols = 2:(NSanc + 1)] 

NSA nc是制裁類型的數量。