我有一个带有30个变量的数据帧db1。在这30个中,有10个具有顺序名称 - X1,X2,...... X10。所有这些X变量都是字符。我想连接所有这些。所以我当然可以做到
db1$new <- paste(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10)
但是,这并不好玩,如果我有一个包含不同数量X变量的新文件,则此代码将无效。所以,我需要一些使用变量名连接的方法。我试过了
zz1 <- paste(grep('^X',names(db1), value = TRUE))
zz2 <- paste("db1$",zz1,sep="",collapse = ",")
第二个声明是用逗号分隔变量名。然后我尝试使用
进行合并db1$new <- paste(db1$Terms,zz2,collapse = ","))
这不起作用,因为R不理解zz2是文件名。我该怎么办?
答案 0 :(得分:2)
一种选择可以是使用select_
中的dplyr
,然后是apply
。
#data
db1 <- data.frame(id = 1:2, x1 = c("a", "b"), x2 = c("a", "b"),
x3 = c("a", "b"))
library(tidyverse)
db1$new <- db1 %>%
select_(.dots = grep("^x\\d+",names(db1), value = T)) %>%
apply(1,paste,collapse="")
db1
# Result
# id x1 x2 x3 new
#1 1 a a a aaa
#2 2 b b b bbb
答案 1 :(得分:2)
tidyr
和dplyr
的一种方式:
library(dplyr)
library(tidyr)
unite(db1, "var", starts_with("x"), sep = "")
# var z1
# 1 aaa a
# 2 bbb b
这将unite
任意starts_with
“x”列,并将结果存储在名为var
的变量中。
如果数据的结构使得其他变量以“x”开头并不感兴趣(例如“xvar”)并且不应该连接,那么您可以用{{1}替换starts_with
并使用正则表达式。感谢MKR的建议:
matches
数据:
unite(db1, "var", matches("^x\\d+"), sep = "")
# var z1 xvar
# 1 aaa a a
# 2 bbb b b
答案 2 :(得分:1)
将do.call
与paste0
一起使用,如下所示,使用如下数据集(使用@MKR数据):
df <- structure(list(id = 1:2, X1 = c("a", "b"), X2 = c("a", "b"),
X3 = c("a", "b")), .Names = c("id",
"X1", "X2", "X3"), row.names = c(NA, -2L), class = "data.frame")
df$pastecol = do.call("paste0",df[,grep("^X\\d+$",names(df))])
<强>输出强>:
#> df$pastecol = do.call("paste0",df[,grep("^X\\d+$",names(df))])
#> df
# id X1 X2 X3 pastecol
#1 1 a a a aaa
#2 2 b b b bbb