选择特定子字符串并使用0和1创建新列

时间:2017-09-16 16:24:43

标签: r

a<- c("01:07", "01:01", "08:01", "06:01")
b <- c("03:04", "05:03", "06:03", "03:07")
df <- data.frame(a,b)
df

嗨,我试图根据列中的特定子字符串将这两列比较为“01”(但不应选择在同一字符串中具有07或08的行),类似于b列中选择substring“03”(但不应选择在同一个字符串中有04或05的那一行)并给我一个新列为0和1。

与上面的df一样,如果我们看到,第1行有01:07和03:04(所以我想选择01和03,但它也有07和04)所以新列应该是0。 但如果我们看到第二行它有01:01(没有07/08)和第二行05:03(没有-04/06)所以新列给出1.所以新列将是0,1,0 ,1

4 个答案:

答案 0 :(得分:1)

使用grepl

grepl("01", df$a)&(-grepl("07", df$a) | -grepl("08", df$a)) & 
  grepl("03", df$b)&(-grepl("04", df$b) | -grepl("06", df$b))

答案 1 :(得分:0)

我使用grepl来检查您的结构。这可能是一种更优雅的方式,但这似乎有效:

inds1 <- grepl("01", df$a) & !(grepl("(07|08)", df$a))
inds2 <- grepl("03", df$b) & !(grepl("(04|05)", df$b))

df$c <- (inds1 | inds2) * 1
# [1] 0 1 1 1

inds1检查两件事并仅在满足两个条件时返回TRUE:字符串包含01不包含<{em> 包含{{1}也不是07

08应用相同的想法,但使用其他标准。

然后,

inds2将逐行检查其中一个值是否符合他们所在列的标准

答案 2 :(得分:0)

也许使用strsplit

fun <- function(x, y){
    x <- strsplit(as.character(x), ":")
    y <- strsplit(as.character(y), ":")
    i1 <- sapply(x, function(.x) .x[1] == "01" & !(.x[2] %in% c("07", "08")))
    i2 <- sapply(y, function(.y) .y[1] == "03" & !(.y[2] %in% c("04", "05")))
    as.integer(i1 | i2)
}

fun(df$a, df$b)
[1] 0 1 0 1

df$c <- fun(df$a, df$b)

答案 3 :(得分:0)

OP可能需要澄清他的逻辑(第2行在b中有05,所以它应该为零?),但是可能会使用负面的lookbehind和lookahead:

logic1 = grepl("(?<!(07|08):)01(?!:(07|08))", df$a, perl = TRUE) 
logic2 = grepl("(?<!(04|05):)03(?!:(04|05))", df$b, perl = TRUE)

df$c = as.integer(logic1 & logic2)

#       a     b c
# 1 01:07 03:04 0
# 2 01:01 05:03 0
# 3 08:01 06:03 0
# 4 06:01 03:07 1