如何在对象的列名上使用粘贴?
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 = "-")
原答案:
根据显示的输出,您似乎想将 sal1
、sal2
和 sal3
粘贴在一起,但要使用 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 = "-"))
假设我有以下数据库:
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 = "-")
原答案:
根据显示的输出,您似乎想将 sal1
、sal2
和 sal3
粘贴在一起,但要使用 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 = "-"))