将虚拟列反向转换为一个变量

时间:2020-06-14 23:55:58

标签: r dplyr tidyr

示例:

    var path = new Path.Circle({
    radius: 100,
    fillColor: 'blue',
    center: view.center
});

path.tween(
    { radius: 100, fillColor: 'blue' },
    { radius: 200, fillColor : 'red'},
    2000
);

看起来像这样:

np.unique(np.sort(arr),axis=0)

是否有一种开箱即用的非自定义函数方法,使“ my_diamonds”回到原来的形式,并且只有一个“颜色”列?

3 个答案:

答案 0 :(得分:2)

您可以使用pivot_longer

library(dplyr)

tidyr::pivot_longer(my_diamonds, cols = starts_with('color'), 
                    names_to = 'color', 
                    names_pattern = '.*_(.*)') %>%
       filter(value == 1) %>%
       select(-value)


# A tibble: 53,940 x 10
#   carat cut       clarity depth table price     x     y     z color
#   <dbl> <ord>     <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>
# 1 0.23  Ideal     SI2      61.5    55   326  3.95  3.98  2.43 E    
# 2 0.21  Premium   SI1      59.8    61   326  3.89  3.84  2.31 E    
# 3 0.23  Good      VS1      56.9    65   327  4.05  4.07  2.31 E    
# 4 0.290 Premium   VS2      62.4    58   334  4.2   4.23  2.63 I    
# 5 0.31  Good      SI2      63.3    58   335  4.34  4.35  2.75 J    
# 6 0.24  Very Good VVS2     62.8    57   336  3.94  3.96  2.48 J    
# 7 0.24  Very Good VVS1     62.3    57   336  3.95  3.98  2.47 I    
# 8 0.26  Very Good SI1      61.9    55   337  4.07  4.11  2.53 H    
# 9 0.22  Fair      VS2      65.1    61   337  3.87  3.78  2.49 E    
#10 0.23  Very Good VS1      59.4    61   338  4     4.05  2.39 H    
# … with 53,930 more rows

答案 1 :(得分:2)

基本R选项:

cols <- sub("color_", "", grep("^color_", names(my_diamonds), value=TRUE)); cols
[1] "D" "E" "F" "G" "H" "I" "J"

my_diamonds$color <- cols[
     apply(my_diamonds[,grep("^color_", names(my_diamonds))], 1, which.max]

all(my_diamonds$color==diamonds$color)
#[1] TRUE

或者使用更快的max.col(感谢@ chinsoon12):

my_diamonds$color <- cols[max.col(my_diamonds[,grep("^color_", names(my_diamonds))])]

all(my_diamonds$color == diamonds$color)
#[1] TRUE

答案 2 :(得分:2)

使用max.col的另一个选项:

col <- "color"
my_diamonds$color <- my_diamonds %>% 
    select(starts_with(col)) %>%
    {gsub(paste0(col,"_"), "", names(.))[max.col(.)]}