2017-10-30 11 views
0
structure(list(Names = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), .Label = c("A", "B", "C"), class = "factor"), Days = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Values = c(100L, 99L, 98L, 100L, 
99L, 98L, 100L, 99L, 98L)), .Names = c("Names", "Days", "Values" 
), row.names = c(NA, -9L), class = "data.frame") 

structure(list(Names = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), class = "factor", .Label = "Master"), Days = 1:10, 
    Values = c(100L, 99L, 98L, 97L, 96L, 95L, 94L, 93L, 92L, 
    91L)), .Names = c("Names", "Days", "Values"), row.names = c(NA, 
-10L), class = "data.frame") 

私は、特定のサンプルごとにそれぞれの日に対応する値を持つデータテーブルを持っています。私は毎日比較するためのマスター値である別のデータテーブルを持っています。私はマスターテーブルから毎日その日までに分けたいと思います。各要素をベクトルで分ける方法

出力はパーセント値です。

+2

join 'ライブラリ(data.table)が必要です。 df1 $ Values/df2 $値[match(df1 $ Days、df1、df1、df1、df2、div:=値/ i.Values、on = df2 $ Days)] ' – akrun

答えて

0
x <- structure(list(Names = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), Days = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), Values = c(100L, 99L, 98L, 100L, 99L, 98L, 100L, 99L, 98L)), .Names = c("Names", "Days", "Values"), row.names = c(NA, -9L), class = "data.frame") 
mstr <- structure(list(Names = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), class = "factor", .Label = "Master"), Days = 1:10, Values = c(100L, 99L, 98L, 97L, 96L, 95L, 94L, 93L, 92L, 91L)), .Names = c("Names", "Days", "Values"), row.names = c(NA, -10L), class = "data.frame") 

ベースR:

我々は後者からNamesを必要としない、と私はフィールド名が衝突しない持っていることを好むので、私は」、(両方とも.x.yを付けることにそれらを引き起こします) Valuesの名前を変更するでしょう:

mstr <- mstr[-1] 
colnames(mstr)[2] <- "mVal" 

ストレートフォワードマージがValuesをもたらし沿って側修士(今mValValues、あなたはあなたにどんな数学を行うことができますので、直線ベクターとして必要:

y <- merge(x, mstr[-1], by = "Days", all.x = TRUE) 
y 
# Days Names Values mVal 
# 1 1  A 100 100 
# 2 1  C 100 100 
# 3 1  B 100 100 
# 4 2  A  99 99 
# 5 2  B  99 99 
# 6 2  C  99 99 
# 7 3  B  98 98 
# 8 3  A  98 98 
# 9 3  C  98 98 
y$newVal <- y$Values/y$mVal 
y 
# Days Names Values mVal newVal 
# 1 1  A 100 100  1 
# 2 1  C 100 100  1 
# 3 1  B 100 100  1 
# 4 2  A  99 99  1 
# 5 2  B  99 99  1 
# 6 2  C  99 99  1 
# 7 3  B  98 98  1 
# 8 3  A  98 98  1 
# 9 3  C  98 98  1 

(Iはx内のすべてDaysmstrで存在すると仮定しています。)上記オリジナル/未修飾xmstr使用

dplyr

library(dplyr) 
left_join(x, select(mstr, Days, mVal = Values), by = "Days") 

は、と同じポイントになります。 (基本的なRコードで行ったように、mstrをあらかじめコンディショニングしておくこともできましたが、ここでは代わりにその中間段階を示すと思いました)

+0

AWESOME!ありがとう! –

+0

あなたの質問に完全に対応している場合は、回答の左側にあるチェックマークをチェックして「同意」してください。 (回答者に小さな「感謝」を与えるだけでなく、質問には閉鎖を提供することがうれしいです。) – r2evans

関連する問題