2016-05-01 14 views
2

私はRに新しく、新しいstackoverflowになっています。私はdata.tableを見つけようとしていて、 "R data.tableは別のdata.tableの値のインデックスを置き換える"ことを見て、私が理解したと思ったが、私が望むものを得ることはできないと思った。R data.table複数の列の値を置き換えます。

私は2つのデータフレームを持っています。最初のものは興味のあるデータで、2つ目は最初のデータフレームのIDを変換するための名前/ IDを含むキーです。 "key" data.tableを使用して、テーブル$ id1とテーブル$ id2の数値を "key" data.tableの "Names"に変換したいと考えています。ここで私はこれまで管理してきたものだ:

table<-data.table("Sample" = sample(40:46, 6), "Conc1" = sample(100:106,6), 
       "id1" = as.character(sample(1:6, 6)), "Conc2" = sample(200:206,6), 
       "id2" = as.character(sample(1:6, 6))) 

key<-data.table("Name" = c("Sally", "John", "Roger", "Bob", "Kelsey", "Molly"), 
      "id1" = as.character(1:6)) 

setkey(table, id1) 
setkey(key, id1) 

table[key, `:=`(id1 = i.Name)] 

私は(テーブルの$ ID1で名前の値を置換)ここまで得ているだけでなく、列名を変更することなく、ID2を変更する方法を見つけ出すことはできません、リセットキーとid2のための上記の同じ手順を再実行します。実際のデータセットでは、複数のSally、Johnなどが存在し、同じキーを使用してコードが両方の列を「翻訳」したいと考えています。

コードを狙っているのは、(学習目的のために)data.tableを使用していますが、これをさらに改善する別のパッケージがあれば、それも素晴らしいでしょう。ありがとう!

答えて

0

これを実行する別の方法:

dt <- merge(table,key,by.x = c('id1'),by.y = c('id1'),sort=F) 

table <- merge(dt,key,by.x = c('id2'),by.y = c('id1'),sort=F) 

table[,id1 := Name.x] 
table[,id2 := Name.y] 
table[,Name.x := NULL] 
table[,Name.y := NULL] 

##  id2 id1 Sample Conc1 Conc2 
##1: Bob Bob  41 101 200 
##2: Kelsey John  46 100 203 
##3: Roger Molly  43 102 206 
##4: Sally Kelsey  42 105 201 
##5: John Roger  44 106 202 
##6: Molly Sally  45 104 204 
4

data.tableでは、あなたが参加行うためのキーを設定する必要はありません。結合列はon=引数で指定できます。

data.table v1.9.6の時点で、on=引数を使用して異なる列名に参加できます。

library(data.table) ## v1.9.6 + 

## update id1 based on Name 
table[ key, on = c("id1"), nomatch = 0, id1 := i.Name] 
## here the id1 column is getting updated to i.Name 
## (the 'i.' is the prefix given to columns on the 'right' side of the join). 

## update id2 based on Name 
table[ key, on = c(id2 = "id1"), nomatch = 0, id2 := i.Name] 

table 

# Sample Conc1 id1 Conc2 id2 
#1:  40 100 John 201 John 
#2:  43 101 Kelsey 206 Kelsey 
#3:  45 103 Molly 205 Roger 
#4:  42 102 Roger 204 Bob 
#5:  44 104 Sally 200 Molly 
#6:  41 105 Bob 202 Sally 

データ

## setting seed because we are sampling 
set.seed(1234) 
table<-data.table("Sample" = sample(40:46, 6), "Conc1" = sample(100:106,6), 
        "id1" = as.character(sample(1:6, 6)), "Conc2" = sample(200:206,6), 
        "id2" = as.character(sample(1:6, 6))) 

key<-data.table("Name" = c("Sally", "John", "Roger", "Bob", "Kelsey", "Molly"), 
       "id1" = as.character(1:6)) 
関連する問題