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

How to use paste on column names from object?

假设我有以下数据库:

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

我试过类似下面的东西:

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

请建议,提前致谢。

可能是这样的:

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

...尽管您可能会发现在将 round sal1 等值粘贴在一起之前,您想要 round

如果您只有字符向量中的列,您可以试试这个而不是 with() 部分:

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

编辑:

感谢@joran 和@Gregor(来自评论)帮助我理解使用 eval(parse(text = '')) 不是好的做法。此外,我编写的函数不必要地过于复杂。所以刚刚找到了一个简单的解决方案,只有一个 loop (apply)

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

原答案:

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

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

您可以在 sapply 中使用 eval(parse( 组合来获取值,然后 apply 按行计算 paste 列一起

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