2016-06-28 5 views
0

I数値ベクトルを有する:乗算値

> dput(vec_exp) 
structure(c(12.344902729712, 6.54357482855349, 17.1939193108764, 
      23.1029632631654, 8.91495023159554, 14.3259091357051, 18.0494234749187, 
      2.92524638658168, 5.10306474037357, 2.66645609602021), .Names = c("Arthur_1", 
                       "Mark_1", "Mark_2", "Mark_3", "Stephen_1", "Stephen_2", 
                       "Stephen_3", "Rafael_1", "Marcus_1", "Georg_1")) 

を、その後、私は以下のようなデータ・フレームがあります。私がしたい

 Name  Nr  Numb 
1 Rafael  20.8337 20833.7 
2 Joseph  25.1682 25168.2 
3 Stephen  40.5880 40588.0 
4 Leon  198.7730 198773.0 
5 Thierry  16.5430 16543.0 
6 Marcus  31.6600 31660.0 
7 Lucas  39.6700 39670.0 
8 Georg  194.9410 194941.0 
9 Mark  60.1020 60102.0 
10 Chris  56.0578 56057.8 

を数字のベクトルの数字にこのデータフレームの列Nrの数字を掛けます。もちろん、名前に値を掛けることは重要です。数値ベクトルのMark_1にはNr = 60.1020、Mark_2と同じStephen_3、40.5880などを乗算する必要があります。

誰かが簡単に解決策を提案できますか?

答えて

2

あなたは何の一致がdata.frameにありませんので、アーサーはNAある

vec_exp * df$Nr[match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name)] 
# Arthur_1  Mark_1  Mark_2  Mark_3 Stephen_1 Stephen_2 Stephen_3 Rafael_1 Marcus_1 Georg_1 
#  NA 393.28193 1033.38894 1388.53430 361.84000 581.46000 732.59000 60.94371 161.56303 519.80162 

などすなわちMark_1からMarkを抽出し、vec_expの名前の最初の部分のみを抽出した後、名前を一致させるためにmatchを使用することができます。


あなたは、彼らが前にあったように、データで一致せずにこれらのエントリを保持したい場合、あなたはこのようにそれを行うことができます:

i <- match(sub("^([^_]+).*", "\\1", names(vec_exp)), df$Name) 
vec_exp[!is.na(i)] <- vec_exp[!is.na(i)] * df$Nr[na.omit(i)] 

この最初の試合を計算して、場合にのみ、それらを乗算彼らはNAではありません。

2

base Rメソッドを使用できます。 vectorstackdata.frameに変換し、 'ind'の部分文字列を削除して 'Name'列を作成し、data.frame( 'df1')を使用してmergeを作成します。次に、「Nr」と「値」列を掛けることができます。

d1 <- merge(df1, transform(stack(vec_exp), Name = sub("_.*", "", ind)), all.y=TRUE) 
d1$Nr*d1$values 

またはdplyrと、理解し、はるかに簡単です。

library(dplyr) 
library(tidyr) 
stack(vec_exp) %>% 
     separate(ind, into = c("Name", "ind")) %>% 
     left_join(., df1, by = "Name") %>% 
     mutate(res = values*Nr) %>% 
     .$res 
#[1]   NA 393.28193 1033.38894 1388.53430 361.84000 
#[6] 581.46000 732.59000 60.94371 161.56303 519.80162