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
答案 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