【问题标题】:How to use result of pattern matching in R [duplicate]如何在R中使用模式匹配的结果[重复]
【发布时间】:2017-12-05 05:54:45
【问题描述】:

我有一个带有字符串值的数据框

id str
a  1
b  10
c  0
d  102
e  010

我需要创建一个标志,如果 str 中有 0,则标志为 1,否则,标志为 0

我正在使用以下代码:

df$flag <-ifelse(grep('0', df$str) == "1", 1, 0)

但这返回的行数少于 df 中的总行数。

检查后发现

grep('0', df$str[1]) returns int(0)

而 grep('0', df$str[2]) 返回 1

知道如何使用它

【问题讨论】:

  • as.numeric(grepl("0", df$str))

标签: r regex


【解决方案1】:
#df$flag <- NULL #unneeded. skip it.
df$flag <- ifelse(grepl('0',df$str), 1, 0)

你需要grepl 而不是grep

【讨论】:

  • @RonakShah 啊,你说得对。在用 ifelse 矢量化语句填充之前,我习惯于用 NA 初始化另一列。
  • 这被称为JAVA hangover
  • @Hardikgupta 想知道JAVA hangover 是什么?
  • 对语言没有任何影响(我喜欢它)——在 Java 中,我们需要在使用每个变量之前对其进行初始化,这与 R Python 不同。
  • @Hardikgupta 哈哈,我明白了。有时对于NA 值,我在使用ifelse 语句时遇到错误。实际上这就是我习惯使用NA 进行初始化的原因。我根本不擅长 Java :)
【解决方案2】:

你可以像这样使用grepl

df <- read.table(text = "id str
a  1
b  10
c  0
d  102
e  010", header = T)

df$Flag <- ifelse(grepl(0,df$str), 1, 0)

> df
  id str Flag
1  a   1    0
2  b  10    1
3  c   0    1
4  d 102    1
5  e  10    1

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2012-10-27
    • 2015-03-15
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多