2016-09-20 4 views
0

私は、次のDbを持っていると仮定します。私が欲しいものを基本的にオブジェクトの列名に貼り付ける方法は?

db<-data.frame(para=c(round(rnorm(20,10,10),0)),sal1=c(rnorm(20,100,7)),sal2=c(rnorm(20,100,7)),sal3=c(rnorm(10,100,7)),sal4=rep(c("a","b"),5)) 

para  sal1  sal2  sal3  sal4 
1 13 104.73988 96.53538 107.03285 a 
2  1 94.54826 88.79930 101.17248 b 
3 26 102.36344 94.83702 91.11708 a 
4 13 99.32913 95.90670 90.49470 b 

を:

paste(db$sal1,db$sal2,db$sal3, sep="-") 
para sal1 sal2 sal3  sal4    newcol 
1  8 105.11 101.38 100.01 a 105.11-101.38-100.01 
2  2 109.55 88.98 104.12 b 109.55-88.98-104.12 
3 25 100.12 103.84 102.43 a 100.12-103.84-102.43 
4 15 105.22 90.95 100.67 b 105.22-90.95-100.67 
5 21 97.57 97.78 103.89 a 97.57-97.78-103.89 
6 -1 101.88 100.22 88.21 b 101.88-100.22-88.21 
7 12 104.20 95.26 93.72 a 104.2-95.26-93.72 
8 16 106.25 100.70 94.95 b 106.25-100.7-94.95 
9 24 101.36 97.91 99.67 a 101.36-97.91-99.67 

実際に私が望む方法:変数colnameful

何かを使用して

colnam<-c("sal1","sal2","sal3") 
colnameful<-paste0("db$",colnam) 

はペースト私は試したのように:

paste(colnameful, sep="-") # Useless 

お早めにお申し込みください。

+0

は '' C( "SAL1"、 "SAL2"、 "sal3")を 'ことcolnam'べきではないですか? –

+1

ohhありがとうございます。 –

答えて

4

たぶんのようなもの:

colnam<-c("sal1","sal2","sal3") 
db[[paste(colnam,collapse = "-")]] <- with(db,paste(sal1,sal2,sal3,sep = "-")) 

...あなたがそれらを一緒に貼り付ける前にsal1などの値をroundしたいことを見つけるかもしれません。

あなたが唯一の文字ベクトルの列を持っている場合は、代わりにwith()片でこれを試みることができる:

do.call(paste,c(db[,colnam],sep = "-")) 
+0

まだ 'with(db、paste(sal1、sal2、sal3、sep =" - "))'と書く必要があります。 –

+2

@AbhijeetAroraおそらく 'do.call(paste、c(db [、colnam]、sep =" - "))'を実行することができます。 – joran

+0

これはまさに私が欲しかったものです! ..ありがとうございました..答えでこれを編集できるので、私は答えを受け入れることができますか? –

0

EDIT:@joranする

おかげで、@Gregor(コメントから)eval(parse(text = ''))を使用することは良い習慣ではないことを理解してくれました。また、私が書いた機能は、不必要に複雑なものでした。だから、ただ一つだけloopapply

apply(db[colnam], 1, paste, collapse = "-") 

オリジナル回答と簡単な解決策を見つけた:出力に基づいて

が示され、あなたが一緒にsal1sal2sal3を貼り付けたいようだが、使用してcolnam

colnam<-c("sal1","sal2","sal3") 

あなたはeval(parse(を組み合わせて使用​​することができますI N sapply、値を取得し、apply行単位演算pasteに列一緒

apply(sapply(paste0("db$",colnam), function(x) eval(parse(text = x))), 1, 
          function(x) paste(x, collapse = "-")) 
+0

なぜdownvote?私はそれを間違って解釈しましたか? –

+0

私はダウンワードを一切与えなかった!ちょうど私のupvoteを与えた。 –

+2

FYI、 'eval(parse(text = ...))を推薦するものは、それが広く強く推奨されていないので、下の票で満たされます。 – joran

関連する問題