【问题标题】:Looking for an R script that can do the following: if value x of column A contains certain string then write y in a new column B寻找可以执行以下操作的 R 脚本:如果列 A 的值 x 包含某个字符串,则将 y 写入新列 B
【发布时间】:2020-02-21 00:59:27
【问题描述】:

我正在尝试基于另一个变量在 R 中创建一个新变量。基本上我想要做的是:如果 A 列中的值 x 包含特定的字符串,那么(在新列中)写 y。

例如,在我的数据集中,我有一个名为“条件”的变量,它具有以下唯一值:

[1] "05_CL_dom" "16_CF_sub" "02_CL_sub" "01_CL_dom" "19_CF_dom" "14_CL_sub" "17_CL_dom" "10_CL_sub" "09_CL_dom" "15_CF_dom"
[11] "18_CL_sub" "06_CL_sub" "20_CF_sub" "12_CF_sub" "04_CF_sub" "08_CF_sub" "24_CF_sub" "11_CF_dom" "21_CL_dom" "22_CL_sub"
[21] "23_CF_dom" "07_CF_dom" "03_CF_dom" "13_CL_dom" "06_CL_dom" "07_CF_sub" "16_CF_dom" "03_CF_sub" "12_CF_dom" "11_CF_sub"
[31] "17_CL_sub" "14_CL_dom" "21_CL_sub" "20_CF_dom" "22_CL_dom" "19_CF_sub" "01_CL_sub" "08_CF_dom" "15_CF_sub" "13_CL_sub"
[41] "18_CL_dom" "09_CL_sub" "05_CL_sub" "23_CF_sub" "10_CL_dom" "24_CF_dom" "04_CF_dom" "02_CL_dom" "18_CF_sub" "05_CF_dom"
[51] "02_CF_sub" "03_CL_dom" "21_CF_dom" "01_CF_dom" "12_CL_sub" "19_CL_dom" "20_CL_sub" "23_CL_dom" "16_CL_sub" "22_CF_sub"
[61] "04_CL_sub" "11_CL_dom" "10_CF_sub" "06_CF_sub" "14_CF_sub" "07_CL_dom" "15_CL_dom" "08_CL_sub" "24_CL_sub" "13_CF_dom"
[71] "09_CF_dom" "17_CF_dom" "19_CL_sub" "13_CF_sub" "10_CF_dom" "16_CL_dom" "05_CF_sub" "09_CF_sub" "06_CF_dom" "03_CL_sub"
[81] "08_CL_dom" "14_CF_dom" "17_CF_sub" "21_CF_sub" "01_CF_sub" "24_CL_dom" "23_CL_sub" "22_CF_dom" "07_CL_sub" "18_CF_dom"
[91] "20_CL_dom" "04_CL_dom" "11_CL_sub" "02_CF_dom" "12_CL_dom" "15_CL_sub"

基于这些值,我想创建一个名为“conditionNEW”的新变量:
- 如果条件值包含 CL_sub -> CLsub
- 如果条件值包含 CL_dom -> CLdom
- 如果条件值包含 CF_sub -> CFsub
- 如果条件值包含 CF_dom -> CFdom

现在,我所做的是:

rawdata$conditionNEW[rawdata$condition == "01_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "02_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "03_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "04_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "05_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "06_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "07_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "08_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "09_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "10_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "11_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "12_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "13_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "14_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "15_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "16_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "17_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "18_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "19_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "20_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "21_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "22_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "23_CF_dom"] <- "CFdom"
rawdata$conditionNEW[rawdata$condition == "24_CF_dom"] <- "CFdom"

rawdata$conditionNEW[rawdata$condition == "01_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "02_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "03_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "04_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "05_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "06_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "07_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "08_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "09_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "10_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "11_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "12_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "13_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "14_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "15_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "16_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "17_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "18_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "19_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "20_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "21_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "22_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "23_CF_sub"] <- "CFsub"
rawdata$conditionNEW[rawdata$condition == "24_CF_sub"] <- "CFsub"

rawdata$conditionNEW[rawdata$condition == "01_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "02_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "03_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "04_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "05_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "06_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "07_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "08_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "09_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "10_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "11_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "12_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "13_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "14_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "15_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "16_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "17_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "18_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "19_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "20_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "21_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "22_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "23_CL_dom"] <- "CLdom"
rawdata$conditionNEW[rawdata$condition == "24_CL_dom"] <- "CLdom"

rawdata$conditionNEW[rawdata$condition == "01_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "02_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "03_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "04_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "05_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "06_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "07_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "08_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "09_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "10_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "11_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "12_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "13_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "14_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "15_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "16_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "17_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "18_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "19_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "20_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "21_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "22_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "23_CL_sub"] <- "CLsub"
rawdata$conditionNEW[rawdata$condition == "24_CL_sub"] <- "CLsub"

它可以工作,但它的代码很多,感觉应该相当简单。有谁知道如何用更少的代码做到这一点?

【问题讨论】:

  • 如果你想匹配一个模式,你可以像rawdata$conditionNEW[grepl("CF_dom", rawdata$condition)] &lt;- "CFdom"这样的东西。您可以只用 4 行代码替换所有这些代码行,每个模式一个。
  • 谢谢!我发了第二张就知道了。显然,为什么当我第一次尝试 grepl 时它不起作用,是因为我的条件变量是一个因素。
  • 您不应编辑您的问题以包含“答案”。如果您回答了自己的问题,则应将其作为答案放在下面。我回滚了你的编辑。如果您愿意,您仍然可以删除。
  • 好的,很高兴知道,谢谢!

标签: r


【解决方案1】:

你可以使用 ifelse 语句

rawdata$conditionnew <- ifelse(  
    grepl( "CL_sub" , rawdata$condition ) , "CLsub", 
    ifelse(   
        grepl( "CL_dom" , rawdata$condition ) , "CLdom",
        ifelse( 
            grepl( "CF_sub" , rawdata$condition ) , "CF_sub",
            ifelse( 
                grepl( "CF_dom" , rawdata$condition ) , "CF_dom", NA))))

你也可以在这里使用正则表达式:

rawdata$conditionNEW  <- gsub( "[0-9]|_" , "", rawdata$condition  )

【讨论】:

  • 谢谢!我发了第二张就知道了。显然,为什么当我第一次尝试 grepl 时它不起作用,是因为我的条件变量是一个因素。
  • 试试我的第二种方法,更简单
  • 我认为第 4 条ifelse 语句是不必要的,因为所有数据都由上述条件描述,因此不需要 NA。所以这应该足够了:rawdata$conditionnew &lt;- ifelse(grepl("CL_sub" , rawdata$condition), "CLsub", ifelse(grepl("CL_dom" , rawdata$condition ) , "CLdom", ifelse(grepl( "CF_sub" , rawdata$condition ) , "CF_sub", "CF_dom")))
  • 确实如此。这对我来说似乎更安全。但是你的观点被采纳了
  • @Iris。您关于grepl 失败原因的结论是不正确的。它适用于因子输入。 grepl 的代码将首先对因子进行 as.character 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多