2016-05-01 30 views
2

Ich bin neu in R und neu in stackoverflow. Ich versuche, data.table herauszufinden und schaute "R data.table, das einen Index der Werte von einer anderen data.table ersetzt" und dachte, dass ich verstanden habe, aber kann nicht erhalten, was ich will.R data.table ersetze Werte in mehreren Spalten

Ich habe zwei Datenrahmen - der erste ist die Daten, die ich interessiert, und der zweite ist ein Schlüssel mit Namen/IDs, um die IDs im ersten Datenrahmen zu übersetzen. Ich möchte die "key" data.table verwenden, um die Zahlen in der Tabelle $ id1 und der Tabelle $ id2 in die "Names" in der "key" data.table umzuwandeln. Hier ist, was ich bisher geschafft:

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)] 

ich so weit gekommen sind (substituierte Werte für Namen in der Tabelle $ id1), kann aber nicht herausfinden, wie auch ID2 ändern, ohne die Spaltennamen zu ändern, Zurücksetzen die Schlüssel und wiederholen den gleichen Schritt oben für ID2. Im realen Datensatz wird es mehrere Sallys, Johns usw. geben und ich möchte, dass der Code beide Spalten mit demselben Schlüssel "übersetzt".

Ich hoffe, der Code verwendet data.table (für Lernzwecke), aber wenn es ein anderes Paket gibt, das das besser macht, wäre das auch großartig. Vielen Dank!

Antwort

0

Eine andere Methode, dies zu tun:

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

In data.table Sie nicht brauchen, um die Schlüssel zu setzen eine Verknüpfung zu tun. Sie können die Join-Spalten im Argument on= angeben.

Und ab data.table v1.9.6 können Sie bei verschiedenen Spaltennamen mit der on= Argument verbinden.

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 

Daten

## 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)) 
Verwandte Themen