从4个变量创建单个列

时间:2016-08-23 10:43:44

标签: r multiple-columns

我的数据针对每个制裁年制定了制裁措施。有5种类型的定向制裁,但由于我有兴趣查看整体制裁而不是他们的具体类型,我想创建一个新专栏,表示在某一年内是否实施了全面的定向制裁。

<div class="list card" ng-model="tweet" ng-repeat="text in tweet">

  <div class="item item-avatar">
    <img ng-src="{{text.profileImage}}">
    <h2>@{{text.screen_name}}</h2>
    <p>{{correctTimestring(text.timeAt) | date:'medium'}}</p>
  </div>

  <div class="item item-body">
    <img src="{{ newImage || text.image[0].imageurl }}" class="full-image">

    <div ng-model="image" ng-repeat="data in text.image">
      <div class="item item-avatar">
        <img src="{{data.imageurl}}" class="miniImage">
      </div>
    </div>

    <p>
      {{text.text}}
    </p>
    <p>
      <a class="item item-icon-left assertive" href="#">
        <i class="icon ion-social-twitter-outline"></i> Open Link
      </a>
    </p>
  </div>

</div>

我希望它看起来如下:

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

我怎么能得到这个?感谢

5 个答案:

答案 0 :(得分:3)

您可以对包含5种rowSums类型的列进行行向求和(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 :(得分: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)))

此处,列按索引编号而非名称选择。但如果你愿意,你可以轻松地按名称抓取列。

我希望这会有所帮助。

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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)]

NSanc是制裁类型的数量。