5

リスト全体を 1 つのパターンと 1 つの置換で一致させて更新する方法の例を多数見つけましたが、現在探しているのは、単一のステートメントまたはループで複数のパターンと複数の置換に対してこれを行う方法です。

例:

> print(recs)
  phonenumber amount
1     5345091    200
2     5386052    200
3     5413949    600
4     7420155    700
5     7992284    600

Company1 を /^5/、Company2 を /^7/ として、'service_provider' という新しい列を挿入したいと考えています。

これは、R の次の 2 行で実行できます。

recs$service_provider[grepl("^5", recs$phonenumber)]<-"Company1"
recs$service_provider[grepl("^7", recs$phonenumber)]<-"Company2"

それから私は得る:

  phonenumber amount service_provider
1     5345091    200          Company1
2     5386052    200          Company1
3     5413949    600          Company1
4     7420155    700          Company2
5     7992284    600          Company2

国固有の情報を 1 つの場所に保持し、すべてのプログラミング ロジックを別の場所に保持することが容易になるように、grepl の個別のセットではなく、リストを提供したいと思います。

thisPhoneCompanies<-list(c('^5','Company1'),c('^7','Company2'))

他の言語では、電話会社リストで for ループを使用します。

For every row in thisPhoneCompanies
    Add service provider to matched entries in recs (such as the grepl statement)
end loop

しかし、それはRでそれを行う方法ではないことを理解しています.

4

2 に答える 2

4

使用stringi:

library(stringi)
recs$service_provider <- stri_replace_all_regex(str = recs$phonenumber,
                                        pattern = c('^5.*','^7.*'), 
                                        replacement = c('Company1', 'Company2'),
                                        vectorize_all = FALSE)

recs
#   phonenumber amount service_provider
# 1     5345091    200         Company1
# 2     5386052    200         Company1
# 3     5413949    600         Company1
# 4     7420155    700         Company2
# 5     7992284    600         Company2
于 2015-03-16T06:24:39.833 に答える
0

@thelatemail に感謝

電話会社のリストの代わりにデータフレームを使用すると、次のようになります。

phcomp <- data.frame(ph=c(5,7),comp=c("Company1","Company2")) 

1 つのコマンド (match 関数を使用) で、電話番号のリストに新しい列を照合して追加できます。

recs$service_provider <- phcomp$comp[match(substr(recs$phonenumber,1,1), phcomp$ph)]

正規表現を使用できなくなったようですが、ここでの照合は非常に単純で、電話番号の 1 桁目だけです。

于 2015-03-16T06:20:08.633 に答える