1

假设您有一个如下所示的数据集:

          Vietnam    Gulf War     Iraq War
veteran1    1           0            0
veteran2    0           1            0
veteran3    0           0            1
veteran4    0           1            1  # <---- Note this row

您希望合并这些列而不影响数据框中的其他列,如下所示:

          Service  
veteran1    1                  
veteran2    2                     
veteran3    3                            
veteran4    2  # <---- Note this row

在哪里

  • 1 = Vietnam, 2 = Gulf War,3 = Iraq War
  • 如果一名老兵已经服务了 2 个或更多,它应该只选择一个(就像veteran4它选择最左边的列的情况一样)
  • 数据框中还有许多其他列,它们不应受到任何影响

问题:

你会怎么做R呢?

(注意:如果在其他一些免费的开源程序中更容易做到,请随时分享哪个程序以及您将如何做到这一点。这是一个海量数据集:300 万行,美国社区调查。)

4

2 回答 2

3

查看您的数据,这似乎是一个简单的问题:

如果越南> 0,则使用1,否则如果海湾战争> 0,则使用2,否则如果伊拉克> 0,则使用3,否则为0

vietnam = c(1, 0, 0,0) 
gulfwar = c(0,1,0,1)
iraq = c(0,0,1,1)
df = data.frame(vietnam, gulfwar, iraq) 
df$service <- ifelse(df$vietnam > 0,1,ifelse(df$gulfwar>0,2,ifelse(df$iraq>0,3,0)))
df

结果:

       vietnam gulfwar iraq service
  1       1       0    0       1
  2       0       1    0       2
  3       0       0    1       3
  4       0       1    1       2
于 2016-10-30T20:51:37.487 回答
1

也许有点复杂(相对于其他解决方案),但这是一种使用方法apply

df$service <-  apply(df, 1, function(x) which(x == 1)[1] )
df
  vietnam gulfwar iraq service
1       1       0    0       1
2       0       1    0       2
3       0       0    1       3
4       0       1    1       2
于 2016-10-30T21:16:24.887 回答