2016-08-23 68 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是制裁类型的数量。