6

この機械可読な例のような文字列の長いリストがあります。

A <- list(c("Biology","Cell Biology","Art","Humanities, Multidisciplinary; Psychology, Experimental","Astronomy & Astrophysics; Physics, Particles & Fields","Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods","Geriatrics & Gerontology","Gerontology","Management","Operations Research & Management Science","Computer Science, Artificial Intelligence; Computer Science, Information Systems; Engineering, Electrical & Electronic","Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods; Statistics & Probability"))  

したがって、次のようになります。

> A  
[[1]]  
 [1] "Biology"  
 [2] "Cell Biology"  
 [3] "Art"  
 [4] "Humanities, Multidisciplinary; Psychology, Experimental"  
 [5] "Astronomy & Astrophysics; Physics, Particles & Fields"  
 [6] "Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods"  
 [7] "Geriatrics & Gerontology"  
 [8] "Gerontology"  
 [9] "Management"  
[10] "Operations Research & Management Science"  
[11] "Computer Science, Artificial Intelligence; Computer Science, Information Systems; Engineering, Electrical & Electronic"  
[12] "Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods; Statistics & Probability"  

この結果を得るために、これらの用語を編集して重複を排除したいと思います。

 [1] "Science"  
 [2] "Science"  
 [3] "Arts & Humanities"  
 [4] "Arts & Humanities; Social Sciences"  
 [5] "Science"  
 [6] "Social Sciences; Science"  
 [7] "Science"  
 [8] "Social Sciences"  
 [9] "Social Sciences"  
[10] "Science"  
[11] "Science"  
[12] "Social Sciences; Science"  

これまでのところ、私はこれしか得られませんでした:

stringedit <- function(A)  
{  
  A <-gsub("Biology", "Science", A)  
  A <-gsub("Cell Biology", "Science", A)  
  A <-gsub("Art", "Arts & Humanities", A)  
  A <-gsub("Humanities, Multidisciplinary", "Arts & Humanities", A)  
  A <-gsub("Psychology, Experimental", "Social Sciences", A)  
  A <-gsub("Astronomy & Astrophysics", "Science", A)  
  A <-gsub("Physics, Particles & Fields", "Science", A)  
  A <-gsub("Economics", "Social Sciences", A)  
  A <-gsub("Mathematics", "Science", A)  
  A <-gsub("Mathematics, Applied", "Science", A)  
  A <-gsub("Mathematics, Interdisciplinary Applications", "Science", A)  
  A <-gsub("Social Sciences, Mathematical Methods", "Social Sciences", A)  
  A <-gsub("Geriatrics & Gerontology", "Science", A)  
  A <-gsub("Gerontology", "Social Sciences", A)  
  A <-gsub("Management", "Social Sciences", A)  
  A <-gsub("Operations Research & Management Science", "Science", A)  
  A <-gsub("Computer Science, Artificial Intelligence", "Science", A)  
  A <-gsub("Computer Science, Information Systems", "Science", A)  
  A <-gsub("Engineering, Electrical & Electronic", "Science", A)  
  A <-gsub("Statistics & Probability", "Science", A)  
}  
B <- lapply(A, stringedit)  

しかし、それは正しく機能しません:

> B  
[[1]]  
 [1] "Science"  
 [2] "Cell Science"  
 [3] "Arts & Humanities"  
 [4] "Arts & Humanities; Social Sciences"  
 [5] "Science; Science"  
 [6] "Social Sciences; Science, Interdisciplinary Applications; Social Sciences"  
 [7] "Science"  
 [8] "Social Sciences"  
 [9] "Social Sciences"  
[10] "Operations Research & Social Sciences Science"  
[11] "Computer Science, Arts & Humanitiesificial Intelligence; Science; Science"  
[12] "Social Sciences; Science, Interdisciplinary Applications; Social Sciences; Science"  

上記の正しい出力を達成するにはどうすればよいですか?
よろしくお願いします!

4

3 に答える 3

5

ルックアップとして2列を使用するのが最も簡単data.frameで、コース名用に1列、カテゴリ用に1列であることがわかりました。次に例を示します。

course.categories <- data.frame(
  Course = 
  c("Art", "Humanities, Multidisciplinary", "Biology", "Cell Biology", 
    "Astronomy & Astrophysics", "Physics, Particles & Fields", "Mathematics", 
    "Mathematics, Applied", "Mathematics, Interdisciplinary Applications", 
    "Geriatrics & Gerontology", "Operations Research & Management Science", 
    "Computer Science, Artificial Intelligence", 
    "Computer Science, Information Systems", 
    "Engineering, Electrical & Electronic", "Statistics & Probability", 
    "Psychology, Experimental", "Economics", 
    "Social Sciences, Mathematical Methods", 
    "Gerontology", "Management"),
  Category =
  c("Arts & Humanities", "Arts & Humanities", "Science", "Science", 
    "Science", "Science", "Science", "Science", "Science", "Science", 
    "Science", "Science", "Science", "Science", "Science", "Social Sciences", 
    "Social Sciences", "Social Sciences", "Social Sciences", "Social Sciences"))

次に、Aあなたの質問のようにリストとして仮定します:

sapply(strsplit(unlist(A), "; "), 
       function(x) 
         paste(unique(course.categories[match(x, course.categories[["Course"]]),
                                        "Category"]), 
               collapse = "; "))
#  [1] "Science"                            "Science"                           
#  [3] "Arts & Humanities"                  "Arts & Humanities; Social Sciences"
#  [5] "Science"                            "Social Sciences; Science"          
#  [7] "Science"                            "Social Sciences"                   
#  [9] "Social Sciences"                    "Science"                           
# [11] "Science"                            "Social Sciences; Science"

matchからの値をデータセットA内のコース名とcourse.categories一致させ、一致が発生する行を示します。これは、コースが属するカテゴリを抽出するために使用されます。次に、unique各カテゴリが1つだけあることを確認します。paste物事を元に戻します。

于 2012-10-22T12:18:24.377 に答える
4

一例から始めましょう。「CellBiology」という文字列があります。最初の置換はA <-gsub("Biology", "Science", A)、それを「細胞科学」に変えます。その後、これは置き換えられません。

正規表現を使用しないので、置換を行うために一種のハッシュを使用したいと思います。

myhash <- c( "Science", "Science", "Arts & Humanities", "Arts & Humanities", "Social Sciences", 
  "Science", "Science", "Social Sciences", "Science", "Science", "Science", "Social Sciences", 
  "Science", "Social Sciences", "Social Sciences", "Science", "Science", "Science", "Science", 
  "Science" )

names( myhash ) <- c( "Biology", "Cell Biology", "Art", "Humanities, Multidisciplinary", 
  "Psychology, Experimental", "Astronomy & Astrophysics", "Physics, Particles & Fields", "Economics", 
  "Mathematics", "Mathematics, Applied", "Mathematics, Interdisciplinary Applications", 
  "Social Sciences, Mathematical Methods", "Geriatrics & Gerontology", "Gerontology", "Management",
   "Operations Research & Management Science", "Computer Science, Artificial Intelligence", 
  "Computer Science, Information Systems", "Engineering, Electrical & Electronic", 
  "Statistics & Probability" )

これで、「生物学」などの文字列が与えられると、カテゴリをすばやく検索できます。

myhash[ "Biology" ]

文字列のベクトルの代わりにリストを使用する理由がわからないため、ケースを少し簡略化します。

A <- c("Biology","Cell Biology","Art",
  "Humanities, Multidisciplinary; Psychology, Experimental",
  "Astronomy & Astrophysics; Physics, Particles & Fields",
  "Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods",
  "Geriatrics & Gerontology","Gerontology","Management","Operations Research & Management Science",
  "Computer Science, Artificial Intelligence; Computer Science, Information Systems; Engineering, Electrical & Electronic",
  "Economics; Mathematics, Interdisciplinary Applications; Social Sciences, Mathematical Methods; Statistics & Probability")

hasルックアップは、複合文字列( ";"を含む)に対しては機能しません。ただし、を使用してそれらを分割できますstrsplit。次に、を使用uniqueして用語の繰り返しを回避し、paste関数を使用して元に戻すことができます。

stringedit <- function( x ) { 
  # first, split into subterms
  a.all <- unlist( strsplit( x, "; *" ) ) ; 
  paste( unique( myhash[ a.all ] ), collapse= "; " ) 
}

unlist( lapply( A, stringedit  ) )

必要に応じて、結果は次のようになります。

[1] "Science"                            "Science"                            "Arts & Humanities"                  "Arts & Humanities; Social Sciences"
[5] "Science"                            "Social Sciences; Science"           "Science"                            "Social Sciences"                   
[9] "Social Sciences"                    "Science"                            "Science"                            "Social Sciences; Science" 

もちろん、次の*applyように何度か呼び出すことができます。

a.spl <- sapply( A, strsplit, "; *" )
a.spl <- sapply( a.spl, function( x ) myhash[ x ] )
unlist( sapply( a.spl, collapse, "; " )

これは、前のコードよりも多かれ少なかれ効率的ではありません。

はい、正規表現でも同じことができますが、最初に文字列を分割してから、regexのようなものを使用^Biology$して、「Biology」と一致するが「CellBiology」などとは一致しないことを確認します。 「。*Biology」のような構成。最後に、とにかく重複を取り除く必要があります。私の意見では、(i)冗長性が低く(=エラーが発生しやすく)、(ii)努力する価値がありません。

于 2012-10-22T11:03:48.263 に答える
2

そして、使ってswitchみませんか?

science.category <- function(science){
    switch(science,
           "Biology" =,
           "Cell Biology" =,
           "Astronomy & Astrophysics" =,
           "Physics, Particles & Fields" =,
           "Mathematics" =,
           "Mathematics, Applied" =,
           "Mathematics, Interdisciplinary Applications" =,
           "Geriatrics & Gerontology" =,
           "Operations Research & Management Science" =,
           "Computer Science, Artificial Intelligence" =,
           "Computer Science, Information Systems" =,
           "Engineering, Electrical & Electronic" =,
           "Statistics & Probability" = "Science",
           "Art" =,
           "Humanities, Multidisciplinary" = "Arts & Humanities",
           "Psychology, Experimental" =,
           "Economics" =,
           "Social Sciences, Mathematical Methods" =,
           "Gerontology" =,
           "Management" = "Social Sciences",
           NA
           )
}

a <- unlist(lapply(A, strsplit, split = " *; *"), recursive = FALSE)
a1 <- lapply(a, function(x) unique(sapply(x, science.category)))
sapply(a1, paste, collapse = "; ")

もちろん、これは、switch引数として適切な文字列が押し込まれている限り機能します。1つの不一致、およびで終わりますNAgrep一部の高度な使用法では、関数ファミリーを使用するための独自のラッパーを作成する必要がありますagrep

于 2012-10-22T11:48:08.473 に答える