0

V1 と V2 の 2 つの列を持つデータフレームがあり、両方の列に A1、A2、A1+A2、A3 などのエントリがあります。

どちらかの列にもう一方の部分文字列が含まれている場合、行を削除したいと思います。したがって、たとえば、次のように行を削除したいと思います。

A1, A1+A2

A1+A2,A1

次のような行ではありません。

A1+A2, A3

私は現在このコードを使用しています:

subset(dat, !dat$V1 %in% dat$V2)

しかし、このコードは、A1/B1、A2-B2、A 02、A4 などの行を保持したい場合にそれらの行を削除します。

私はおそらく次のように、charmatchを使用できると考えています:

subset(dat, charmatch(dat$V1, dat$V2) == "NA")

しかし、これは空のデータフレームを返します。

このコードを実行して、charmatch が取り除くものを確認すると、次のようになります。

trial <- subset(dat, charmatch(dat$V1, dat$V2) != "NA")

A1/B1、A2-B2、A 02、A4 などの行を保持したい場合に表示されます。

A 02 にスペースがあることが問題だと思いますが、これを解決する方法がわかりません。

また、grep/grepl と正規表現を使用することも考えましたが、ある列の式を別の列に対して検索するときに、これが構文的にどのように見えるかわかりません。最初の列をベクトルに変換して使用しますか?

subset(dat, !grepl(V1vector, dat$V2)) 

?

何か案は?

データセットの一部を次に示します。

V1          V2
A3-B3   B3  
A4/B4   A3-B3   
A 28    A 05    
A 28    A 06    
A2-B2   A2  
B 05    B1  

そして、これは私がそれを次のようにしたいものです:

V1         V2
A4/B4      A3-B3
A 28       A 05
A 28       A 06
B 05       B1
4

2 に答える 2

0

これを試して:

df[!mapply(grepl, df$V2, df$V1),]
于 2013-08-15T19:11:37.360 に答える
0

最小限のデータセット:

f <- structure(list(V1 = c("A3-B3", "A4/B4", "A 28", "A 28", "A2-B2", 
"B 05"), V2 = c("B3", "A3-B3", "A 05", "A 06", "A2", "B1")), .Names = c("V1", 
"V2"), row.names = c(NA, -6L), class = "data.frame")

##entries of V1 that contain V2
mapply(grepl, f$V2, f$V1, MoreArgs=list(fixed=TRUE)) 
##entries of V2 that contain V1
mapply(grepl, f$V1, f$V2, MoreArgs=list(fixed=TRUE))

##combine the two negations
f[!mapply(grepl, f$V2, f$V1, MoreArgs=list(fixed=TRUE)) & 
  !mapply(grepl, f$V1, f$V2, MoreArgs=list(fixed=TRUE)),]
于 2013-08-15T19:19:32.553 に答える