【问题标题】:Add factors to a df by subsetting rows containing certain letters通过子集包含某些字母的行将因子添加到 df
【发布时间】:2019-10-04 16:06:25
【问题描述】:

这是我的数据:

  Year variable value
 1951     MF12 1.441
 1952     MF12 2.068
 1953     RF12 2.008  
 1954     RF12 2.044
 1955     MW12 2.288
 1956     RW12 1.800

其中 MF= 管理框架,RF= 备用框架,MW= 管理风,RW= 备用风。所以总共有 4 个不同的级别 = Managed、Reserve、Frame、Wind。

我想根据这些级别创建两种类型的因素,并将它们作为列添加到数据框中。因素 1 将是 management.type (Managed, Reserve),因素 2 将是 object.type (Frame, Wind)。

类似这样的:

Year variable value Management Object
1951   MF12 1.37845 Managed      Frame 
1952   MF12 1.38950 Managed      Frame
1953   MW12 1.55510 Managed      Wind
1954   RF12 1.66125 Reserve      Frame
1955   RW12 1.62600 Reserve      Wind
1956   RW13 1.58760 Reserve      Wind

我如何使用 R 来做到这一点(而不是返回并在 excel 中排序)?我认为就管理类型而言,可能使用start.with 命令以“M”或“R”开头进行排序,但不知道该怎么做。在Object方面,有没有办法按包含字母'F'或'W'的单词排序?

【问题讨论】:

    标签: r


    【解决方案1】:

    使用

    • 来自dplyrcase_when()ifelse() 的优势在于处理两个以上的情况非常易于管理。
    • substr() 提取第一个字母,然后提取第二个字母,对于更复杂的检查 grepl() 可能需要使用一些正则表达式。
    df$Management <- dplyr::case_when(
      substr(df$variable, 1, 1) == "M" ~ "Managed",
      substr(df$variable, 1, 1) == "R" ~ "Reserved",
    )
    
    df$Object <- dplyr::case_when(
      substr(df$variable, 2, 2) == "F" ~ "Frame",
      substr(df$variable, 2, 2) == "W" ~ "Wind",
    )
    
    df
      Year variable value Management Object
    1 1951     MF12 1.441    Managed  Frame
    2 1952     MF12 2.068    Managed  Frame
    3 1953     RF12 2.008   Reserved  Frame
    4 1954     RF12 2.044   Reserved  Frame
    5 1955     MW12 2.288    Managed   Wind
    6 1956     RW12 1.800   Reserved   Wind
    

    可重现的数据:

    df <- data.frame(
      Year = 1951:1956, 
      variable = c("MF12", "MF12", "RF12", "RF12", "MW12", "RW12"), 
      value = c(1.441, 2.068, 2.008, 2.044, 2.288, 1.8),
      stringsAsFactors = FALSE
    )
    

    【讨论】:

      【解决方案2】:

      试试grepl()ifelse()

      df$Management <- ifelse(test = grepl(pattern = "M", x = df$variable), 
                              yes  = "Managed", 
                              no   = "Reserve")
      

      【讨论】:

      • 完美,谢谢。请问一下,以便我将来知道,'test'在这个函数中的作用是什么?
      【解决方案3】:

      我们可以使用

      library(dplyr)
      df  %>%
          mutate(Management = factor(str_extract(variable, "^."),
                levels = c("M", "R"), labels = c("Managed", "Reserved")), 
                Object = factor(str_extract(variable, "(?<=^.)."), 
                levels = c("F", "W"), labels = c("Frame", "Wind")))
      #   Year variable value Management Object
      #1 1951     MF12 1.441    Managed  Frame
      #2 1952     MF12 2.068    Managed  Frame
      #3 1953     RF12 2.008   Reserved  Frame
      #4 1954     RF12 2.044   Reserved  Frame
      #5 1955     MW12 2.288    Managed   Wind
      #6 1956     RW12 1.800   Reserved   Wind
      

      【讨论】:

        猜你喜欢
        • 2020-08-12
        • 2017-03-15
        • 2021-06-07
        • 2021-09-21
        • 2021-12-10
        • 2017-02-23
        • 1970-01-01
        • 2021-07-30
        • 2012-08-27
        相关资源
        最近更新 更多