【问题标题】:How do I create a new categorical variable from continuous multiple observations?如何从连续的多个观察中创建新的分类变量?
【发布时间】:2018-09-25 15:58:14
【问题描述】:

这是我的数据:

ID  dist
1   23
1   10
2   12
2   20
3   14
3   33

我想遍历每个 ID,并为每个 ID 的较大值创建一个新列(“状态”),将其称为“高”,对于较小的值,将其称为“低”。

最好的方法是什么?

【问题讨论】:

    标签: r dataframe dplyr tapply


    【解决方案1】:

    使用 R 基础

    > transform(df1, state = ave(dist, ID, FUN= function(x)ifelse(x==max(x), "high", "low")))
    
      ID dist state
    1  1   23  high
    2  1   10   low
    3  2   12   low
    4  2   20  high
    5  3   14   low
    6  3   33  high
    

    【讨论】:

    • 如果它在transform 内,则不需要df1$ 可以用transform(df1, state = c('low', 'high')[(ave(dist, ID, FUN = max) == dist) + 1]) 做得更紧凑一些
    【解决方案2】:

    我们可以用max/min创建一个条件

    library(dplyr)
    df1 %>%
      group_by(ID) %>%
      mutate(state = case_when(dist == max(dist) ~  "high",
                               dist == min(dist) ~ "low",
                               TRUE  ~ NA_character_))
    

    因为每个“ID”有两个值,所以不需要第二个条件

    df1 %>%
      group_by(ID) %>%
      mutate(state = case_when(dist == max(dist) ~  "high",
                             TRUE  ~"low"))
    

    数据

    df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L), dist = c(23L, 
    10L, 12L, 20L, 14L, 33L)), class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      【解决方案3】:

      使用 data.table...

      library(data.table)
      setDT(DF)
      
      DF[order(ID, dist), v := c("lo", "hi")]
      
         ID dist  v
      1:  1   23 hi
      2:  1   10 lo
      3:  2   12 lo
      4:  2   20 hi
      5:  3   14 lo
      6:  3   33 hi
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        相关资源
        最近更新 更多