2

問題があり、古い投稿を確認したにもかかわらず、この問題が既に議論されている場合は、お詫び申し上げます。

2 列の data.frame があります。2 番目の列には複数の識別子を含めることができますが、数は異なる場合があります。別の data.frame では、識別子は別の識別子に対応します。

df.1  

color   identifier
blue    A1, B2, C3, C4 
yellow  B2, C4, C6
green   A3

df.2

A1 Mercedes
A3 BMW
B2 Porsche
C3 Toyota
C4 Hundai
C5 Volkswagen
C6 Peugeot    

私が持ちたいのは、次のような data.frame です。

df.3

color   identifier        identifier2
blue    A1, B2, C3, C4    Mercedes, Porsche, Toyota, Hundai 
yellow  B2, C4, C6        Porsche, Hundai, Peugeot
green   A3                BMW

識別子と、さらに 2 番目の data.frame の識別子を含む data.frame。

apply と stack と unstack を使用しようとしましたが、まったく成功しませんでした。

何か提案はありますか?

4

2 に答える 2

2

を使用した別のソリューションを次に示しますstrsplit

# The data
df.1  = read.table(header=TRUE, text="
color   identifier
blue    'A1, B2, C3, C4'
yellow  'B2, C4, C6'
green   'A3'", stringsAsFactors = FALSE)

df.2 = read.table(header=FALSE, text="
A1 Mercedes
A3 BMW
B2 Porsche
C3 Toyota
C4 Hundai
C5 Volkswagen
C6 Peugeot", stringsAsFactors=FALSE)
names(df.2) = c("identifier", "car")

df.1$identifier = strsplit(df.1$identifier, split=", ")
df.1$identifier1 = lapply(1:nrow(df.1), 
         function(x) df.2[which(df.2$identifier %in% df.1$identifier[[x]]), 2])
df.1
#    color     identifier                       identifier1
# 1   blue A1, B2, C3, C4 Mercedes, Porsche, Toyota, Hundai
# 2 yellow     B2, C4, C6          Porsche, Hundai, Peugeot
# 3  green             A3                               BMW

identifieridentifier1がのリストになっていることに注意してくださいdata.frame。個人的には、この方が後で作業しやすいと思います。

str(df.1)
# 'data.frame':  3 obs. of  3 variables:
#   $ color      : chr  "blue" "yellow" "green"
# $ identifier :List of 3
#  ..$ : chr  "A1" "B2" "C3" "C4"
#  ..$ : chr  "B2" "C4" "C6"
#  ..$ : chr "A3"
# $ identifier1:List of 3
#  ..$ : chr  "Mercedes" "Porsche" "Toyota" "Hundai"
#  ..$ : chr  "Porsche" "Hundai" "Peugeot"
#  ..$ : chr "BMW"

strsplit空白が残っている場合は変更が必要になる場合がありますが、このサンプル データでは機能します。また、機能strsplitするには、データがモードになっている必要がありますas.character(したがって、stringsAsFactorsデータを読み込むときに を使用します)。

更新: write.table()

さらに分析したい場合に備えて、データをリストに保持することを好みますただし、データが完全であるか、単に出力目的である場合は、次のようにしたい場合があります。

df.3 = df.1
df.3$identifier = sapply(df.3$identifier, paste0, collapse=", ")
df.3$identifier1 = sapply(df.3$identifier1, paste0, collapse=", ")

これにより、 の代わりにwrite.tablesinceidentifierおよびidentifier1are now of モードを使用できるようになります。characterlist

于 2012-08-01T08:35:27.133 に答える
1

おそらく最も簡単な方法は、で正規表現を使用gsubして置換を行うことです。

データを再作成します。

df1 <- read.table(text="
color   identifier
blue    'A1, B2, C3, C4'
yellow  'B2, C4, C6'
green   A3
", header=TRUE)


df2 <- read.table(text="
A1 Mercedes
A3 BMW
B2 Porsche
C3 Toyota
C4 Hundai
C5 Volkswagen
C6 Peugeot 
", header=FALSE)

そして今、あなたはあなたのカラールックアップ(df2)の各要素をループして、で置換をしなければなりませんdf1

for (i in seq_len(nrow(df2))){
  df1$identifier <- gsub(df2[i, 1], df2[i, 2], df1$identifier)
}

結果:

df1
   color                        identifier
1   blue Mercedes, Porsche, Toyota, Hundai
2 yellow          Porsche, Hundai, Peugeot
3  green                               BMW
于 2012-08-01T08:20:26.070 に答える