如何在对象的列名上使用粘贴?

时间:2016-09-20 17:50:42

标签: r paste

假设我有以下Db:

if (word.indexOf(guessChar) == -1) {     //if guessChar is not present in the word...

基本上我想要的是:

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

使用变量colnam<-c("sal1","sal2","sal3") colnameful<-paste0("db$",colnam)

进行粘贴

我试过以下的事情:

colnameful

请建议,提前致谢。

2 个答案:

答案 0 :(得分:4)

可能是这样的:

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

...虽然您可能会在将round等值粘贴在一起之前发现sal1 with()

如果您只在字符向量中包含列,则可以尝试此而不是do.call(paste,c(db[,colnam],sep = "-")) 段:

├─ app.py
├─ project
|  ├─ __init__.py
|  └─ static
|     └─ typescript
|        └─ app.ts
└─ typings
   ├─ globals
   |  └─ ... # multiple imported ts libraries
   └─ index.d.ts

答案 1 :(得分:0)

编辑:

感谢@joran和@Gregor(来自评论),他们帮助我理解使用eval(parse(text = ''))不是一个好习惯。我写的功能也不必要地过于复杂。所以我们发现只有一个loopapply

的简单解决方案
apply(db[colnam], 1, paste, collapse = "-") 

原始答案:

根据显示的输出,您似乎想要将sal1sal2sal3粘贴在一起,但使用colnam

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

您可以在eval(parse(中使用sapply组合获取值,然后apply逐行计算到paste

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