【问题标题】:How to create new column by two different variables?如何通过两个不同的变量创建新列?
【发布时间】:2021-04-06 10:56:38
【问题描述】:

我有一个这样的data.frame:

Term     Value   Rel     
 1 can       0   0.5       
 2 can       1   0.6        
 3 can       2   0.8       
 4 can       3   1        
 5 lol       0   5.1       
 6 lol       1   5.5    
 7 lol       2  12.9      
 8 lol       3  17.3     
 9 eas       0  10.4     
10 eas       1  74.1    
10 eas       2  26.1     
10 eas       3  61.8     

我想按Value 0-3 或Term 列对新列进行分组,并从Rel 列中获取最大值并将这个新列Reltop 添加到现有的data.frame 中,其他值将是 NA 或空白。

我想要这样的data.frame:

Term     Value   Rel   Relmax  
 1 can       0   0.5   NA    
 2 can       1   0.6   NA     
 3 can       2   0.8   NA   
 4 can       3   1     1   
 5 lol       0   5.1   NA   
 6 lol       1   5.5   NA 
 7 lol       2  12.9   NA   
 8 lol       3  17.3   17.3  
 9 eas       0  10.4   NA  
10 eas       1  74.1   74.1 
10 eas       2  26.1   NA  
10 eas       3  61.8   NA  

我试过这个,但这个解决方案不能保留 df 的其余部分:

data.frame <- data.frame %>%
  group_by(Term) %>%
  summarize(Reltop = max(rel))

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用ifelse 仅在最大位置分配值。

    library(dplyr)
    
    df %>%
      group_by(term) %>%
      mutate(Relmax = ifelse(Rel == max(Rel), max(Rel), NA)) %>%
      ungroup
    
    #   term  Value   Rel Relmax
    #   <chr> <int> <dbl>  <dbl>
    # 1 can       0   0.5   NA  
    # 2 can       1   0.6   NA  
    # 3 can       2   0.8   NA  
    # 4 can       3   1      1  
    # 5 lol       0   5.1   NA  
    # 6 lol       1   5.5   NA  
    # 7 lol       2  12.9   NA  
    # 8 lol       3  17.3   17.3
    # 9 eas       0  10.4   NA  
    #10 eas       1  74.1   74.1
    #11 eas       2  26.1   NA  
    #12 eas       3  61.8   NA  
    

    【讨论】:

    • 太棒了,非常感谢。你知道如何在 Relmax 列中为新的数值添加 % 符号吗?
    • 您可以将mutate 行更改为mutate(Relmax = ifelse(Rel == max(Rel), paste0(max(Rel), '%'), NA)),但请注意该列将不再是数字,因为% 符号是字符。
    【解决方案2】:

    我们也可以这样做

    library(dplyr)
    df1 %>%
       group_by(Term) %>%
       mutate(Relmax = Rel * NA^(Rel != max(Rel))) %>%
       ungroup
    

    -输出

    # A tibble: 12 x 4
    #   Term  Value   Rel Relmax
    #   <chr> <int> <dbl>  <dbl>
    # 1 can       0   0.5   NA  
    # 2 can       1   0.6   NA  
    # 3 can       2   0.8   NA  
    # 4 can       3   1      1  
    # 5 lol       0   5.1   NA  
    # 6 lol       1   5.5   NA  
    # 7 lol       2  12.9   NA  
    # 8 lol       3  17.3   17.3
    # 9 eas       0  10.4   NA  
    #10 eas       1  74.1   74.1
    #11 eas       2  26.1   NA  
    #12 eas       3  61.8   NA  
    

    数据

    df1 <- structure(list(Term = c("can", "can", "can", "can", "lol", "lol", 
    "lol", "lol", "eas", "eas", "eas", "eas"), Value = c(0L, 1L, 
    2L, 3L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 3L), Rel = c(0.5, 0.6, 0.8, 
    1, 5.1, 5.5, 12.9, 17.3, 10.4, 74.1, 26.1, 61.8)), class = "data.frame",
    row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多