根据优先级列表生成新列

问题描述 投票:1回答:2

有一个优先级列表,如:

Google: High priority
Yahoo: medium priority
Microsoft: low priority

来自二进制数据帧,如下所示:

> df  <- data.frame(id = c(1,2,3), Google = c(1,1,0), Yahoo = c(1,1,1), Microsoft = c(0,1,1))
> df
  id Google Yahoo Microsoft
1  1      1     1         0
2  2      1     1         1
3  3      0     1         1

如何生成一个新的数据帧,其中列是相同的,但根据优先级,只有具有最高优先级的列保持1,而另一行在每一行中取0?

预期结果的例子:

> df  <- data.frame(id = c(1,2,3), Google = c(1,1,0), Yahoo = c(0,0,1), Microsoft = c(0,0,0))
> df
  id Google Yahoo Microsoft
1  1      1     0         0
2  2      1     0         0
3  3      0     1         0
r dataframe
2个回答
2
投票

使用:

mc <- max.col(df[-1], ties.method = 'first')
df[-1] <- 0
df[cbind(1:nrow(df), mc + 1)] <- 1

得到:

> df
  id Google Yahoo Microsoft
1  1      1     0         0
2  2      1     0         0
3  3      0     1         0

如果公司列不在优先级顺序中,您可以使用以下命令进行更改:

priority <- c('Google',"Yahoo",'Microsoft')
df <- df[, c(1, match(priority, names(df)))]

1
投票

我们也可以使用apply函数:

 df[-1]= t(apply(df[-1], 1, function(x)`[<-`(x,-which.max(x),0)))
 df
  id Google Yahoo Microsoft
1  1      1     0         0
2  2      1     0         0
3  3      0     1         0
© www.soinside.com 2019 - 2024. All rights reserved.