2017-09-16 3 views
1
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 

HIで新しい列を作成し、Iが「01」のように列内の特定のサブストリングに基づいて、これらの2つの列を比較しようとしているM(しかし07を有している行を選択してはなりません同じ文字列の04または05の行を選択しないでください)。特定のサブストリングを選択し、0と1

上記のdfと同様に、行1は01:07と03:04を持ちます(01と03を選択したいが07と04もあるので)。新しい列は0になるはずです。 しかし、 2列目は01:01(no-07/08)で、2番目の行は05:03(no-04/06)なので、新しい列は1になります。新しい列がgreplを使用して0,1,0,1

+0

希望の出力を投稿してください – PoGibas

+0

行bのために04/05か04/06が嫌いですか?あなたの2つの段落はお互いに同意しない – useR

答えて

0

にいる列の基準を満たしているかどうかを行単位チェックが入ります。

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) 
+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)) 
0

。そこよりエレガントな方法は、おそらくですが、これは動作するようです:

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が含まれていると0708が含まれていません。

inds2は、同じ考え方を適用しますが、その他の基準を適用します。

df$cは、値のいずれかが、彼らはstrsplitでたぶん

0

OPは(2行目はbで05を持っているので、それがゼロになるはず?)彼のロジックを明確にする必要があるかもしれません、しかし、1つは、負の後読みと先読みを使用する場合があります。

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 
関連する問題