0

データフレーム内の列の要素を別のデータフレームと照合したいと思います。

次のデータフレームを検討してください。

A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3) 
B=data.frame(par=c('Z','D','A'),val=letters[1:3])

B 列の「par」の各要素は、A 列の par と照合する必要があります。一致する場合は、A でラベル付けする必要があります [これにより、A と B をマージするための共通の値の列が得られます]。

したがって、望ましい結果は次のとおりです。

A=transform(A,label=c('A','NA','D'))

これはどのように行うことができますか?

ヘンク

4

4 に答える 4

2

私が考えたアプローチ:

M <- lapply(strsplit(as.character(A$par), " "), function(x) x[x %in% B$par])
M[sapply(M, function(x) {identical(x, character(0))})] <- NA
A$label <- unlist(M)
A

           par val label
1 long A story   1     A
2 long C story   2  <NA>
3     blabla D   3     D

ここで答えをマイクロベンチマークし、結果は次のとおりです。

Unit: microseconds
       expr      min       lq   median       uq      max
1  EDWARD() 1638.815 1678.934 1698.061 1726.983 4973.823
2   SONAL()  705.348  725.874  734.738  747.334 2085.721
3     TLM()  268.705  281.300  287.831  294.362 1465.744
4 TRINKER()  156.278  168.407  173.538  177.737 1331.391

ここに画像の説明を入力してください

于 2012-07-26T12:12:51.103 に答える
2

こんにちは、次のようなことができます:

list <- lapply(1:length(B$par),function(x) grep(B$par[x],A$par))
list
[[1]]
integer(0)

[[2]]
[1] 3

[[3]]
[1] 1

label <- rep("NA",length(list))

B$par <-as.character(B$par)

label[unlist(list)] <- B$par[which(list != "integer(0)")]
label
[1] "A"  "NA" "D" 

A <- transform(A,label=label)
A
           par val label
1 long A story   1     A
2 long C story   2    NA
3     blabla D   3     D

お役に立てれば。

于 2012-07-26T12:03:37.197 に答える
1

便利な関数にループがない場合:

findkey <- function(key,terms) {
  result <- sapply(as.character(key),function(x) grepl(x,terms))
  result <- apply(result,1,function(x) names(x)[x==TRUE])
  result[(lapply(result,length)==0)] <- NA

  return(unlist(result))
}

現在の例に適用します。

A$label <- findkey(B$par,A$par)

結果:

> A
           par val label
1 long A story   1     A
2 long C story   2  <NA>
3     blabla D   3     D
于 2012-07-26T12:12:16.390 に答える
1

あなたが求めていることをするために、試してみてください

A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3) 
B=data.frame(par=c('Z','D','A'),val=letters[1:3])
A$label <- NA
for (x in B$par){
    is.match <- lapply(A$par,function(y) grep(x, y))
    A$label[which(is.match > 0)] <- x
}

(あなたの例では大文字の A を意味していると思いましたA=transform(a,label=c('A','NA','D'))。その場合、これらは正確に一致します)。編集:あなたがその編集を行ったようです。その場合、それらは一致します。

上記の方法は、すべての A に適合する B が 1 つだけ存在する場合にのみ機能します (つまり、B に複数の A を指定できますが、A に複数の B を指定することはできません)。これは、出力に必要な構造のためです。

于 2012-07-26T11:52:15.070 に答える