【问题标题】:How to write an R function replace a TRUE with "X" and a FALSE with "Y"如何编写 R 函数将 TRUE 替换为“X”,将 FALSE 替换为“Y”
【发布时间】:2021-06-08 22:30:05
【问题描述】:

我目前正在尝试编写一个函数,用于评估字符变量在字符内是否有“F”或“M”,并且该字符也有多个数字(即 3849F 是 ID 3849,女性)。我已经整理出一个函数来给我一个布尔输出,它给出 TRUE is F is present and FALSE is M is present。

我现在如何使用此布尔输出将这些替换为所需的“F”和“M”字符值?

到目前为止我的代码如下:

sex = list()    
for (i in 1:length(dataset)){
      fsex = grepl("F", dataset, fixed = T)
      if (fsex == T) sex = c(sex, "F")
      else if (fsex == F) sex = c(sex, "M")
    }

【问题讨论】:

  • 首先,grepl 是矢量化的,因此不需要循环。 grepl 的结果是一个逻辑向量。这可能被强制转换为数字索引,可用于索引“F”和“M”的向量:x = c("12F", "23M", "34F", "45M"); c("M", "F")[grepl("F", x) + 1]。请确保发布一个 minimal 示例(易于复制粘贴,即 不是 图像;),潜在的帮助者可以在上面试用他们的代码。干杯
  • @Henrik 谢谢!这有帮助,我能够让它发挥作用。还要感谢您对代码示例的建议——我也会确保做一个粘贴的版本。

标签: r function if-statement boolean character


【解决方案1】:

这适用于任意布尔向量。您可以改用数据框列。

> bools <- c(T,T,F)
> new_col <- ifelse(bools, "F", "M")
> new_col
[1] "F" "F" "M"

您也可以重新分配原始数据。

> gender <- c(T,T,F)
> gender <- ifelse(gender, "F", "M")
> gender
[1] "F" "F" "M"

【讨论】:

    【解决方案2】:

    如果您使用dplyr,您可以使用单个函数来实现此目的,而不需要您已经创建的函数,然后是您在问题中引用的第二个函数。

    df<- data.frame(
      stringsAsFactors = FALSE,
                    ID = c("125F", "13000M", "13120M", "12260M", "21525F")
    )
    
    library(dplyr)
    #> 
    #> Attaching package: 'dplyr'
    #> The following objects are masked from 'package:stats':
    #> 
    #>     filter, lag
    #> The following objects are masked from 'package:base':
    #> 
    #>     intersect, setdiff, setequal, union
    df %>% 
      mutate(fsex = case_when(
        grepl("F", ID) ~ "F",
        grepl("M", ID) ~ "M"
      ))
    #>       ID fsex
    #> 1   125F      F
    #> 2 13000M      M
    #> 3 13120M      M
    #> 4 12260M      M
    #> 5 21525F      F
    

    reprex package (v1.0.0) 于 2021-03-11 创建

    【讨论】:

      【解决方案3】:

      因为您的数据已经包含您希望获取的 FM 值,并且它始终位于每个条目的末尾,您可以考虑使用 regex 模式将每个条目的最后一个字符提取为反对转换为逻辑(即您的函数)然后返回字符(即您要求的函数)。 stringr 包对此很有帮助。

      这是一个使用 tidyverse 的示例:

      library(dplyr)
      library(stringr)
      
      dataset <- data.frame(matrix(paste0(sample(1:100), sample(c("M", "F"))), nrow = 10))
      dataset
      #>     X1  X2  X3  X4  X5  X6  X7   X8  X9 X10
      #> 1  74M 59M 69M 96M 66M 53M  4M  43M 30M 33M
      #> 2  64F 25F 95F 71F 16F 14F 22F  70F 20F 48F
      #> 3  29M 78M 26M 94M  1M 21M 62M  77M 56M 13M
      #> 4  61F 49F 86F 50F 51F 82F 91F  52F  7F 32F
      #> 5  73M 92M 55M 80M 11M  9M 45M  81M 35M  2M
      #> 6  42F 23F  3F 79F 47F 10F 28F  57F 40F 31F
      #> 7  65M 63M 88M 38M 27M 76M 67M  75M 83M 15M
      #> 8  46F 44F 34F 60F 58F  6F 85F  89F 54F 98F
      #> 9  37M 90M 68M  5M 93M 41M 72M  87M  8M 19M
      #> 10 99F 18F 17F 97F 24F 12F 39F 100F 84F 36F
      
      dataset %>% 
        mutate(across(X1:X10, ~ str_extract(., ".$")))
      #>    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
      #> 1   M  M  M  M  M  M  M  M  M   M
      #> 2   F  F  F  F  F  F  F  F  F   F
      #> 3   M  M  M  M  M  M  M  M  M   M
      #> 4   F  F  F  F  F  F  F  F  F   F
      #> 5   M  M  M  M  M  M  M  M  M   M
      #> 6   F  F  F  F  F  F  F  F  F   F
      #> 7   M  M  M  M  M  M  M  M  M   M
      #> 8   F  F  F  F  F  F  F  F  F   F
      #> 9   M  M  M  M  M  M  M  M  M   M
      #> 10  F  F  F  F  F  F  F  F  F   F
      

      reprex package (v1.0.0) 于 2021-03-10 创建

      【讨论】:

      • 它的基本 R 版本是 dataset[] &lt;- lapply(dataset, function(x) substring(x, nchar(x))),它不需要正则表达式或其他包。
      【解决方案4】:

      @Henrik 提供了我认为您在 cmets 中寻找的答案,但根据您对 R 的经验,可能不清楚。

      详细说明:

      sex <- c("125F", "X28345M", "2M3")
      sex
      #>[1] "125F"    "X28345M" "2M3"
      
      output <- ifelse(grepl(sex, pattern = "F", ignore.case = TRUE), "F", "M")
      output
      #>[1] "F" "M" "M"
      
      fsex <- grepl(sex, pattern = "F", ignore.case = TRUE)
      #>[1]  TRUE FALSE FALSE
      

      您还可以使用这种方法轻松地将“F”和“M”替换为“女性”或“男性”,或“0”和“1”。

      【讨论】:

      • 哇,谢谢!这确实有助于澄清 - 并且效果很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2017-10-14
      • 2019-08-27
      • 2011-06-16
      相关资源
      最近更新 更多